{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Chapter 17 – Autoencoders**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "_This notebook contains all the sample code in chapter 17._"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, let's import a few common modules, ensure MatplotLib plots figures inline and prepare a function to save the figures. We also check that Python 3.5 or later is installed (although Python 2.x may work, it is deprecated so we strongly recommend you use Python 3 instead), as well as Scikit-Learn ≥0.20 and TensorFlow ≥2.0-preview."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Python ≥3.5 is required\n",
    "import sys\n",
    "assert sys.version_info >= (3, 5)\n",
    "\n",
    "# Scikit-Learn ≥0.20 is required\n",
    "import sklearn\n",
    "assert sklearn.__version__ >= \"0.20\"\n",
    "\n",
    "# TensorFlow ≥2.0-preview is required\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "assert tf.__version__ >= \"2.0\"\n",
    "\n",
    "# Common imports\n",
    "import numpy as np\n",
    "import os\n",
    "\n",
    "# to make this notebook's output stable across runs\n",
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)\n",
    "\n",
    "# To plot pretty figures\n",
    "%matplotlib inline\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "mpl.rc('axes', labelsize=14)\n",
    "mpl.rc('xtick', labelsize=12)\n",
    "mpl.rc('ytick', labelsize=12)\n",
    "\n",
    "# Where to save the figures\n",
    "PROJECT_ROOT_DIR = \".\"\n",
    "CHAPTER_ID = \"autoencoders\"\n",
    "IMAGES_PATH = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID)\n",
    "os.makedirs(IMAGES_PATH, exist_ok=True)\n",
    "\n",
    "def save_fig(fig_id, tight_layout=True, fig_extension=\"png\", resolution=300):\n",
    "    path = os.path.join(IMAGES_PATH, fig_id + \".\" + fig_extension)\n",
    "    print(\"Saving figure\", fig_id)\n",
    "    if tight_layout:\n",
    "        plt.tight_layout()\n",
    "    plt.savefig(path, format=fig_extension, dpi=resolution)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A couple utility functions to plot grayscale 28x28 image:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_image(image):\n",
    "    plt.imshow(image, cmap=\"Greys\", interpolation=\"nearest\")\n",
    "    plt.axis(\"off\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# PCA with a linear Autoencoder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Build 3D dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(4)\n",
    "\n",
    "m = 200\n",
    "w1, w2 = 0.1, 0.3\n",
    "noise = 0.1\n",
    "\n",
    "angles = np.random.rand(m) * 3 * np.pi / 2 - 0.5\n",
    "data = np.empty((m, 3))\n",
    "data[:, 0] = np.cos(angles) + np.sin(angles)/2 + noise * np.random.randn(m) / 2\n",
    "data[:, 1] = np.sin(angles) * 0.7 + noise * np.random.randn(m) / 2\n",
    "data[:, 2] = data[:, 0] * w1 + data[:, 1] * w2 + noise * np.random.randn(m)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Normalize the data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "X_train = scaler.fit_transform(data[:100])\n",
    "X_test = scaler.transform(data[100:])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's build the Autoencoder..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 100 samples, validate on 100 samples\n",
      "Epoch 1/20\n",
      "100/100 [==============================] - 0s 3ms/sample - loss: 1.3767 - val_loss: 0.8100\n",
      "Epoch 2/20\n",
      "100/100 [==============================] - 0s 91us/sample - loss: 0.6408 - val_loss: 0.5684\n",
      "Epoch 3/20\n",
      "100/100 [==============================] - 0s 77us/sample - loss: 0.4541 - val_loss: 0.4266\n",
      "Epoch 4/20\n",
      "100/100 [==============================] - 0s 91us/sample - loss: 0.3436 - val_loss: 0.3135\n",
      "Epoch 5/20\n",
      "100/100 [==============================] - 0s 81us/sample - loss: 0.2516 - val_loss: 0.2268\n",
      "Epoch 6/20\n",
      "100/100 [==============================] - 0s 88us/sample - loss: 0.1858 - val_loss: 0.1720\n",
      "Epoch 7/20\n",
      "100/100 [==============================] - 0s 105us/sample - loss: 0.1440 - val_loss: 0.1308\n",
      "Epoch 8/20\n",
      "100/100 [==============================] - 0s 83us/sample - loss: 0.1140 - val_loss: 0.1072\n",
      "Epoch 9/20\n",
      "100/100 [==============================] - 0s 105us/sample - loss: 0.0955 - val_loss: 0.0903\n",
      "Epoch 10/20\n",
      "100/100 [==============================] - 0s 102us/sample - loss: 0.0827 - val_loss: 0.0814\n",
      "Epoch 11/20\n",
      "100/100 [==============================] - 0s 82us/sample - loss: 0.0750 - val_loss: 0.0755\n",
      "Epoch 12/20\n",
      "100/100 [==============================] - 0s 102us/sample - loss: 0.0694 - val_loss: 0.0687\n",
      "Epoch 13/20\n",
      "100/100 [==============================] - 0s 90us/sample - loss: 0.0650 - val_loss: 0.0659\n",
      "Epoch 14/20\n",
      "100/100 [==============================] - 0s 90us/sample - loss: 0.0621 - val_loss: 0.0631\n",
      "Epoch 15/20\n",
      "100/100 [==============================] - 0s 108us/sample - loss: 0.0598 - val_loss: 0.0619\n",
      "Epoch 16/20\n",
      "100/100 [==============================] - 0s 78us/sample - loss: 0.0586 - val_loss: 0.0607\n",
      "Epoch 17/20\n",
      "100/100 [==============================] - 0s 105us/sample - loss: 0.0573 - val_loss: 0.0602\n",
      "Epoch 18/20\n",
      "100/100 [==============================] - 0s 109us/sample - loss: 0.0572 - val_loss: 0.0586\n",
      "Epoch 19/20\n",
      "100/100 [==============================] - 0s 98us/sample - loss: 0.0564 - val_loss: 0.0580\n",
      "Epoch 20/20\n",
      "100/100 [==============================] - 0s 102us/sample - loss: 0.0555 - val_loss: 0.0575\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "\n",
    "encoder = keras.models.Sequential([keras.layers.Dense(2, input_shape=[3])])\n",
    "decoder = keras.models.Sequential([keras.layers.Dense(3, input_shape=[2])])\n",
    "autoencoder = keras.models.Sequential([encoder, decoder])\n",
    "\n",
    "autoencoder.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(lr=0.1))\n",
    "history = autoencoder.fit(X_train, X_train, epochs=20, validation_data=[X_test, X_test])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "codings_test = encoder.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure linear_autoencoder_pca_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(4,3))\n",
    "plt.plot(codings_test[:,0], codings_test[:, 1], \"b.\")\n",
    "plt.xlabel(\"$z_1$\", fontsize=18)\n",
    "plt.ylabel(\"$z_2$\", fontsize=18, rotation=0)\n",
    "save_fig(\"linear_autoencoder_pca_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Stacked Autoencoders"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's use MNIST:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "(X_train_full, y_train_full), (X_test, y_test) = keras.datasets.fashion_mnist.load_data()\n",
    "X_train_full = X_train_full / 255\n",
    "X_test = X_test / 255\n",
    "X_train, X_valid = X_train_full[:-5000], X_train_full[-5000:]\n",
    "y_train, y_valid = y_train_full[:-5000], y_train_full[-5000:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train all layers at once"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's build a stacked Autoencoder with 3 hidden layers and 1 output layer (i.e., 2 stacked Autoencoders)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 5s 86us/sample - loss: 0.3474 - accuracy: 0.4987 - val_loss: 0.3166 - val_accuracy: 0.5005\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.3089 - accuracy: 0.5054 - val_loss: 0.3061 - val_accuracy: 0.5030\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 4s 67us/sample - loss: 0.3020 - accuracy: 0.5064 - val_loss: 0.3016 - val_accuracy: 0.5031\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 4s 75us/sample - loss: 0.2976 - accuracy: 0.5070 - val_loss: 0.2972 - val_accuracy: 0.5041\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 4s 72us/sample - loss: 0.2946 - accuracy: 0.5074 - val_loss: 0.2948 - val_accuracy: 0.5042\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 4s 71us/sample - loss: 0.2926 - accuracy: 0.5076 - val_loss: 0.2937 - val_accuracy: 0.5042\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 4s 66us/sample - loss: 0.2909 - accuracy: 0.5078 - val_loss: 0.2917 - val_accuracy: 0.5049\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 4s 65us/sample - loss: 0.2897 - accuracy: 0.5079 - val_loss: 0.2907 - val_accuracy: 0.5047\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 4s 66us/sample - loss: 0.2888 - accuracy: 0.5080 - val_loss: 0.2900 - val_accuracy: 0.5051\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 4s 65us/sample - loss: 0.2880 - accuracy: 0.5080 - val_loss: 0.2890 - val_accuracy: 0.5051\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "stacked_encoder = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(100, activation=\"selu\"),\n",
    "    keras.layers.Dense(30, activation=\"selu\"),\n",
    "])\n",
    "stacked_decoder = keras.models.Sequential([\n",
    "    keras.layers.Dense(100, activation=\"selu\", input_shape=[30]),\n",
    "    keras.layers.Dense(28 * 28, activation=\"sigmoid\"),\n",
    "    keras.layers.Reshape([28, 28])\n",
    "])\n",
    "stacked_ae = keras.models.Sequential([stacked_encoder, stacked_decoder])\n",
    "stacked_ae.compile(loss=\"binary_crossentropy\", optimizer=keras.optimizers.SGD(lr=1.),\n",
    "                   metrics=[\"accuracy\"])\n",
    "history = stacked_ae.fit(X_train, X_train, epochs=10,\n",
    "                         validation_data=[X_valid, X_valid])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This function processes a few test images through the autoencoder and displays the original images and their reconstructions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def show_reconstructions(model, n_test_images = 2):\n",
    "    reconstructions = model.predict(X_test[:n_test_images])\n",
    "    fig = plt.figure(figsize=(8, 3 * n_test_images))\n",
    "    for image_index in range(n_test_images):\n",
    "        plt.subplot(n_test_images, 2, image_index * 2 + 1)\n",
    "        plot_image(X_test[image_index])\n",
    "        plt.subplot(n_test_images, 2, image_index * 2 + 2)\n",
    "        plot_image(reconstructions[image_index])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure reconstruction_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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BSRgACggAQNAAQkYAApIwABQQAIGgAISMAAUkIABoIAEDAAFJGAAKLCo6LofFF33E+Gdd97pxnfv3t2N33DDDRfzdv6fffv2dePLli3rxjds2HAxb+fTYEH1DVwC5s1c8cEH/Y+S4q21du7cuW788OHDE/371lpbvXp1N7548eJu/Pjx43Gs/fv3d+M7duzoxjdv3hzHuuyyy7rxBQvm1ePV/TDegAGggAQMAAUkYAAoIAEDQAEJGAAKVFVBf6pcuHAhHnvggQe68b/8y7+M5xw4cKAbf+utt7rxFStWxLFSNeQ0UrXz8uXLu/FFi/LP50tf+lI3/pu/+Zvd+E033fT/uTv45EiVy2fOnInn3H///d343/3d38Vz0rN36NChbvzo0aNxrMsvv7wb//Ef//Fu/I033ohj7d27txtfs2ZNN54qnVtr7frrr+/G/+RP/qQbv+666+JYo+t8EnkDBoACEjAAFJCAAaCABAwABSRgACggAQNAgQWjhcAvok/kAut/+qd/2o3/0R/9UTznxIkT3XhqH2gttxUtWbKkGx+1NqSNHd5///1ufOnSpXGslStXduPvvfdeN/7222/Hsc6ePduNp5auL37xi3Gshx9+OB4rNq9Wi/+EKp0r0vz493//9914arNrLc8Vo3a+TZs2deMLF07+7pTml5mZmW48zS2t5Y0S0mYQqW2qtTyPpGt84QtfiGM99NBD3fiolfNjYjMGAPikkIABoIAEDAAFJGAAKCABA0CBS7IK+tFHH+3G77777m58y5YtcaxUwZgq+FrLlZXvvvvuRNcYSdcf3df58+fn5BqttbZ48eJuPC2WPlr4/Vd+5Ve68b/5m7/JN/fxUAV98ZXOFaly+ZprrunGT58+HcdK3QRpk4TWWtu4cePg7v6v0TOZrjNpFXJruZshnXPkyJE41rFjx7rx1MkxqgC/6667uvHHH388njP6nHNIFTQAfFJIwABQQAIGgAISMAAUkIABoMDk5bXzwFe+8pVufM2aNd14qtxtLVcD7t+/f+L7Wr9+fTc+qvpL1canTp3qxtNara3listUjTj6XlJlZaoAH1Waf/Ob3+zG03rTrY3X4oYf1l/8xV904ydPnpx4rPSsbt++PZ6T1oI+cOBAN57mo9Za27BhQzee1nwezWGpojrNYaNK7zRXpPsafcann366Gx9Vp4/u7WLzBgwABSRgACggAQNAAQkYAApIwABQQAIGgAKXZBtSWvx7ZmamG0+LqLeWS/V///d/P57za7/2a934tm3buvGtW7fGsdImBqtXr+7Gr7/++jjW7OxsN7506dJufN++fXGstFh9ag9Kf5PWWjtz5kw3fujQoYmvDx812pDmiSee6MbTAv7Lli2LY6V2lx07dsRz0rM/TZtdamlK0nzU2uSbrYxaBtMmNAcPHuzGU4vl6Pp79uyJ5+zcuTMeu9i8AQNAAQkYAApIwABQQAIGgAISMAAUuCSroNPi36mCcVQlmfze7/1ePDZptXWqAm6ttS9/+cvd+IMPPji4u75bbrmlG9+1a1c3nr7H1lr7+te/3o1/9atf7cavvPLKOFbaDOLJJ5+M56iCZi6kSvs0V6xYsSKOlTY7GVUnr1q1qhtPldPpWWktV1SnTWhGGxikquZ0/XSN1vJ3+corr3TjP/jBD+JYaa5Mc1hrqqAB4JIjAQNAAQkYAApIwABQQAIGgALztgp6tH5zsnBh//8jo2rf5Gtf+1o89td//dcTjXX48OF4LFU7//mf/3k3vnbt2jjWI4880o2fPHmyGx+t3/xLv/RL3Xiqgh5Vb6b1XZ966ql4zi//8i/HY/BhFy5ciMcOHDjQjafq5CVLlsSxUrXvzTffHM9Jaz7v3bu3Gx9V/6fnaMOGDd3466+/Hsd65513uvFrr722G1+3bl0c69y5c934a6+91o2navLW8hz+1ltvxXMqeQMGgAISMAAUkIABoIAEDAAFJGAAKCABA0CBeduGdOrUqYnPSWX6o80QkjfeeGPic5L/+I//mPic1IazePHieE7adGLz5s3d+Gix9tF15srLL7980a/B/DdqgUstSmlDldSeMzpn9erV8Zx9+/Z14wsWLOjGR89dapFKbZbpuW+ttXfffbcbT+2fo1avNI+k+Xi04UWa95999tl4TiVvwABQQAIGgAISMAAUkIABoIAEDAAF5m0V9IkTJ+ZsrFTx11quOkwLibeWq42Tm266aaJ/31prn/vc57rxV155JZ5zxRVXdONp04Mbb7wxjvX5z3++G7/88su78dHmGek73r17dzwHflijyuV0LG3GMPodp26K/fv3x3PShiepcnjr1q1xrPRZ1qxZ042/+eabcaw0v6ZnNT33reUK6bQJzWg+ThXt//3f/x3PSfNxqjSfS96AAaCABAwABSRgACggAQNAAQkYAApIwABQYN62IR08eHDic0aLsicrV67sxketBam8PZXDHzp0KI71B3/wB934NBsV3Hzzzd14avcZfcd/+7d/240/9thj3fiGDRviWEuXLu3G53LDCy5dqdWntdwikzYwOHv2bBwrtSi9/vrr8ZzUOpTmiu9///txrCuvvLIbT209x48fj2OlTSIOHDjQjZ88eTKOlaRWr2me+9nZ2XgszftpM4i55A0YAApIwABQQAIGgAISMAAUkIABoMC8rYJOC3mPpKq30QLr58+f78ZHi4//2Z/92URjfeMb34hjPfnkk934rl27uvEjR47EsZ599tlu/N577+3GR5shPPPMM/FYz+g7Xriw///E9H3BJEYbt6Rq41QdPfpNpjlh1E2Qfvup+2JU0Z2OpXnv1KlTcayjR49246mbYdSVkTaDuP7667vxPXv2xLFSdfpI+luqggaAeUoCBoACEjAAFJCAAaCABAwABeZtFfSoUi5JFYejNaJTBd3atWvjOb/927890X2Nxtq8eXM3/p//+Z8TXaO11rZs2dKNv/nmm9344sWLJ75GWgc7fY+ttbZkyZKJr5P+ZulvzKVr79698VhaJ3maytmrrrqqGz9z5kw8J3UtLFu2LJ6TpHWl032NnpVUuZ2ukeKt5TWn03yUKtNby+vGnzt3Lp6T/pZprLlkNgKAAhIwABSQgAGggAQMAAUkYAAoIAEDQIF524Z04MCBORtr1AZzzz33dOMPP/xwPGf79u3deGphSK0QreXF39MC5yPpOqkdYLTw+erVq7vxjRs3duP//u//Hse64oor4rEktTasW7du4rHgo6bZCCS17b300kvxnNS2l1oTp2kNPHTo0MTnpOcrfS9vvfVWHGvr1q3deNqMYdTSNI1RC+TF5g0YAApIwABQQAIGgAISMAAUkIABoMC8rYI+duzYxOecPHmyG7/22mvjOV/72te68QceeCCes3Llyonua7QZRFqYfJoqzVRxmcYaVUEvWtT/af3O7/xONz6qgp5G+luqguaj/ud//iceGy383zPqmEjP8alTp+I56TlKVq1aFY+lyuXly5d346PPkiqR06YHo8rl1H2ROjmm+Y5HnSSjYxebN2AAKCABA0ABCRgACkjAAFBAAgaAAvO2CvrIkSPxWKr2PXPmTDd+9dVXx7HSmscjqYovVRun+51r6TrvvffeRP++tVz1eOedd87ZfaXqzdbGlePwYbOzs/FY+h2lat9Rlf369eu78bNnz8Zz0lyR1o2fZp3kac6ZtGNi1JVx+PDhbjx9l6PK9FTRPKqcTutUp3Xr55I3YAAoIAEDQAEJGAAKSMAAUEACBoACEjAAFLgk25BmZma68dRakBYFb621l19+ebIba3mB9WkWBZ/LFqVU3p+uMbr20aNHJz5n0vsatRqlhefho0ZtSAsX9t9R0rN64cKFONbp06cnGqu1yduNDh48OPFYaT5K8+FI+vyjVqe0cUp67kctRamVdGTfvn3d+E/8xE9MPNakvAEDQAEJGAAKSMAAUEACBoACEjAAFJi3VdCjasRJK3FvuOGGeGyaKuhUWZmqekf3O1qYfFLpOum7TNXkrbV27Nixbnzt2rUT31e6/qgKelQFDx+WqnBby89Eeu5Gm7OkaufR7zhthJKeiVTpPBorxVeuXBnHShXd08xhaaOGVDm9YsWKONaJEye68cWLF098zsfBGzAAFJCAAaCABAwABSRgACggAQNAgXlbBZ0q61obVwr27Ny5Mx7753/+54nGam18bz2jSudJ12+e5jqpsnFUWZikKujt27fHc0br2yaVlY18MqXf9xVXXBHPWbduXTeeqvx/5md+Jo6VqopH81HqNFi6dOlE/7613H2RKqrTZ2+tteXLl3fjb7/9djc+zdrsad79yZ/8yXhOWoM+fV+ttbZp06bJbmwOeQMGgAISMAAUkIABoIAEDAAFJGAAKCABA0CBeduGNFqwe9GiyT52Kt9vrbVdu3Z146MWndHi6xdbWni9tfw5U3zSdq7WWjtw4EA3vmPHjnjO7OxsNz5qLUiLxcNHpdaV1lo7e/ZsN55amq655po41pkzZ7rx0XyUntfUyjiaq5YsWTLRWKNNKlLr0qlTp7rxUVtk2qTi8OHD3fhobk0bOIxaPw8dOhSPXWzegAGggAQMAAUkYAAoIAEDQAEJGAAKzNsq6FGlXKrgS1KVXmutvfnmm914Wnh9mutPY5rNGJJU7TyqqE4eeuihbvz666+P53znO9/pxkefMVVQwkeNfkep2jnFV61aFcf6r//6r258NB+kZ2+aZzJtlJDmylG3Rvr8qTNhtBlDuueXXnqpG9+4cWMcK32XaROY1vLGGh8Hb8AAUEACBoACEjAAFJCAAaCABAwABeZtFfRofdVz585NNNbzzz8fj6W1R2dmZuI5qVIvreOaKg5HJq3enMY01dy7d+/uxm+99dZ4zl/91V9146Pq1dHar/Bha9asicfS+snJzp0747Fvf/vbE43VWv6Nz+WckNZNX7ZsWRwrVWFPOre2lqutV69e3Y3fdtttcaz777+/Gx+tW79t27Z8cxeZN2AAKCABA0ABCRgACkjAAFBAAgaAAhIwABSYt21Io/aBSUv4jx49Go+dPXu2G0+LkreW243m6t+3ltsXRq07k7Y8jL7HtPj5t771rW78hhtuiGMlo+8l/V3gozZs2BCPpXbG1H541VVXxbHSRg2jjWOSUVtNkp6XNFeuWLEijpU+f7rG6H7TZgypPWrTpk1xrDQnjeaKaebXueINGAAKSMAAUEACBoACEjAAFJCAAaDAvK2CHlUWLl++vBs/depUN/67v/u7cawHH3ywGx9V4U5TwZikyuVU2ZcWPh9JVYqjz3H8+PFu/Bd/8Re78Z//+Z+PY/3Gb/zGxNdPVZrwUaNnIv32U5X/aN5J1bvTbHqQzklzW2t585R33323Gx9Vhx87dqwbT5sxjLovklQ1vn79+onHGkmf/+PgDRgACkjAAFBAAgaAAhIwABSQgAGggAQMAAXmbRvSqA0oLbCeWghSK0JrefH1F198MZ6TNh4YXWdSk2440Vpux0itEKMNLw4fPtyNp1aM1HIwkv6OrbX2xhtvTDwel6bUfthaa2fOnOnGUxvQypUr41g/93M/140//fTTg7vrSy1C02zskNpwRhtL7NmzpxtP7YdpPmgtz9U33XRTNz5qtUpzQvo7tjbebOdi8wYMAAUkYAAoIAEDQAEJGAAKSMAAUGDeVkH/1E/9VDz26KOPduOpum5UDfjCCy9MdmN0pcXdW2tt9erV3fio0v2OO+74ke+JS8PmzZvjsZmZmTmJt9barbfe2o3fd9998Zy33367G1+xYkU3PtqgJG3Qcv78+W586dKlcay02cmJEye68VQd3VrugNi6dWs3Pqr0Tt/LaHOWtEnFx8EbMAAUkIABoIAEDAAFJGAAKCABA0CBeVsFfdddd8VjaV3QtLbxggUL5uSeyEaViOfOnevG0xq2rU23tjSXpttvvz0eS7+jn/7pn+7GR+ujpyrkHTt2xHOmWdM9SfPYNNdI56TK5bmcQ0fP/fbt27vx2dnZeM5tt932o97S1LwBA0ABCRgACkjAAFBAAgaAAhIwABSQgAGgwLxtQ9q4cWM8ljZqSAt5jxb/Tt5///147FJoa0ptCqkVY/369XGsX/3VX+3G08LvrY3b0ODDbr755njsD//wD7vxO++8sxuf5tkenfNxzBWftvlo1Or1x3/8x934c889F8/5zGc+8yPf07S8AQNAAQkYAApIwABQQAIGgAISMAAUWDCXi30DAD8cb8AAUEACBoACEjAAFJCAAaCABAwABSRgACggAQNAAQkYAApIwABQQAIGgAISMAAUkIABoIBj6jrFAAAAQ0lEQVQEDAAFJGAAKCABA0ABCRgACkjAAFBAAgaAAhIwABSQgAGggAQMAAUkYAAoIAEDQAEJGAAKSMAAUEACBoAC/wt3V3rScdnVTQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(stacked_ae)\n",
    "save_fig(\"reconstruction_plot\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tying weights"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It is common to tie the weights of the encoder and the decoder, by simply using the transpose of the encoder's weights as the decoder weights. For this, we need to use a custom layer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "K = keras.backend\n",
    "\n",
    "class DenseTranspose(keras.layers.Layer):\n",
    "    def __init__(self, dense, activation=None, **kwargs):\n",
    "        self.dense = dense\n",
    "        self.activation = keras.activations.get(activation)\n",
    "        super().__init__(**kwargs)\n",
    "    def build(self, batch_input_shape):\n",
    "        self.biases = self.add_weight(name=\"bias\", shape=[self.dense.input_shape[-1]],\n",
    "                                      initializer=\"zeros\")\n",
    "        super().build(batch_input_shape)\n",
    "    def call(self, inputs):\n",
    "        return self.activation(inputs @ K.transpose(self.dense.weights[0]) + self.biases)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 4s 80us/sample - loss: 0.3229 - accuracy: 0.5023 - val_loss: 0.3014 - val_accuracy: 0.5040\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 4s 72us/sample - loss: 0.2963 - accuracy: 0.5074 - val_loss: 0.3025 - val_accuracy: 0.5029\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 4s 72us/sample - loss: 0.2912 - accuracy: 0.5079 - val_loss: 0.2910 - val_accuracy: 0.5046\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 4s 75us/sample - loss: 0.2881 - accuracy: 0.5082 - val_loss: 0.2879 - val_accuracy: 0.5050\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 4s 71us/sample - loss: 0.2861 - accuracy: 0.5083 - val_loss: 0.2863 - val_accuracy: 0.5051\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.2848 - accuracy: 0.5084 - val_loss: 0.2858 - val_accuracy: 0.5051\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.2838 - accuracy: 0.5085 - val_loss: 0.2851 - val_accuracy: 0.5053\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 4s 71us/sample - loss: 0.2830 - accuracy: 0.5085 - val_loss: 0.2851 - val_accuracy: 0.5051\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.2825 - accuracy: 0.5086 - val_loss: 0.2831 - val_accuracy: 0.5054\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.2819 - accuracy: 0.5086 - val_loss: 0.2830 - val_accuracy: 0.5054\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "tied_encoder = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(100, activation=\"selu\"),\n",
    "    keras.layers.Dense(30, activation=\"selu\"),\n",
    "])\n",
    "tied_decoder = keras.models.Sequential([\n",
    "    DenseTranspose(tied_encoder.layers[2], activation=\"selu\"),\n",
    "    DenseTranspose(tied_encoder.layers[1], activation=\"sigmoid\"),\n",
    "    keras.layers.Reshape([28, 28])\n",
    "])\n",
    "tied_ae = keras.models.Sequential([tied_encoder, tied_decoder])\n",
    "tied_ae.compile(loss=\"binary_crossentropy\", optimizer=keras.optimizers.SGD(lr=1.),\n",
    "                metrics=[\"accuracy\"])\n",
    "history = tied_ae.fit(X_train, X_train, epochs=10, validation_data=[X_valid, X_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(tied_ae)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training one Autoencoder at a time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_autoencoder(n_neurons, X_train, X_valid, loss, optimizer, metrics=None,\n",
    "                      n_epochs=10, output_activation=None):\n",
    "    n_inputs = X_train.shape[-1]\n",
    "    encoder = keras.models.Sequential([\n",
    "        keras.layers.Dense(n_neurons, activation=\"selu\", input_shape=[n_inputs])\n",
    "    ])\n",
    "    decoder = keras.models.Sequential([\n",
    "        keras.layers.Dense(n_inputs, activation=output_activation),\n",
    "    ])\n",
    "    autoencoder = keras.models.Sequential([encoder, decoder])\n",
    "    autoencoder.compile(optimizer, loss, metrics=metrics)\n",
    "    autoencoder.fit(X_train, X_train, epochs=n_epochs,\n",
    "                    validation_data=[X_valid, X_valid])\n",
    "    return encoder, decoder, encoder(X_train), encoder(X_valid)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 4s 68us/sample - loss: 0.5042 - accuracy: 0.4639 - val_loss: 0.4374 - val_accuracy: 0.4874\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 3s 63us/sample - loss: 0.4032 - accuracy: 0.4952 - val_loss: 0.3846 - val_accuracy: 0.4951\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 3s 61us/sample - loss: 0.3696 - accuracy: 0.4996 - val_loss: 0.3624 - val_accuracy: 0.4975\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 4s 65us/sample - loss: 0.3520 - accuracy: 0.5016 - val_loss: 0.3482 - val_accuracy: 0.4992\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 4s 67us/sample - loss: 0.3406 - accuracy: 0.5029 - val_loss: 0.3389 - val_accuracy: 0.5002\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 3s 64us/sample - loss: 0.3330 - accuracy: 0.5037 - val_loss: 0.3325 - val_accuracy: 0.5008\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 4s 70us/sample - loss: 0.3277 - accuracy: 0.5042 - val_loss: 0.3279 - val_accuracy: 0.5013\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 4s 66us/sample - loss: 0.3238 - accuracy: 0.5046 - val_loss: 0.3244 - val_accuracy: 0.5016\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 4s 64us/sample - loss: 0.3208 - accuracy: 0.5049 - val_loss: 0.3216 - val_accuracy: 0.5020\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 4s 64us/sample - loss: 0.3183 - accuracy: 0.5052 - val_loss: 0.3193 - val_accuracy: 0.5021\n",
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 2s 38us/sample - loss: 0.3490 - val_loss: 0.0388\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 2s 33us/sample - loss: 0.0316 - val_loss: 0.0271\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 2s 33us/sample - loss: 0.0236 - val_loss: 0.0203\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 2s 33us/sample - loss: 0.0186 - val_loss: 0.0172\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 2s 33us/sample - loss: 0.0160 - val_loss: 0.0152\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 2s 33us/sample - loss: 0.0145 - val_loss: 0.0141\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 2s 33us/sample - loss: 0.0136 - val_loss: 0.0138\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 2s 32us/sample - loss: 0.0131 - val_loss: 0.0129\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 2s 32us/sample - loss: 0.0127 - val_loss: 0.0126\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 2s 32us/sample - loss: 0.0124 - val_loss: 0.0128\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "X_train_flat = keras.layers.Flatten()(X_train)\n",
    "X_valid_flat = keras.layers.Flatten()(X_valid)\n",
    "enc1, dec1, X_train_enc1, X_valid_enc1 = train_autoencoder(\n",
    "    100, X_train_flat, X_valid_flat, \"binary_crossentropy\", keras.optimizers.SGD(lr=0.1),\n",
    "    output_activation=\"sigmoid\", metrics=[\"accuracy\"])\n",
    "enc2, dec2, _, _ = train_autoencoder(\n",
    "    30, X_train_enc1, X_valid_enc1, \"mse\", keras.optimizers.Adam(),\n",
    "    output_activation=\"selu\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "stacked_ae_1_by_1 = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    enc1,\n",
    "    enc2,\n",
    "    dec2,\n",
    "    dec1,\n",
    "    keras.layers.Reshape([28, 28])\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(stacked_ae_1_by_1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 4s 78us/sample - loss: 0.3109 - accuracy: 0.5057 - val_loss: 0.3080 - val_accuracy: 0.5032\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 4s 65us/sample - loss: 0.3034 - accuracy: 0.5066 - val_loss: 0.3029 - val_accuracy: 0.5039\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 4s 68us/sample - loss: 0.2989 - accuracy: 0.5072 - val_loss: 0.2991 - val_accuracy: 0.5042\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.2954 - accuracy: 0.5076 - val_loss: 0.2958 - val_accuracy: 0.5047\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 4s 76us/sample - loss: 0.2926 - accuracy: 0.5079 - val_loss: 0.2935 - val_accuracy: 0.5048\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 4s 80us/sample - loss: 0.2906 - accuracy: 0.5080 - val_loss: 0.2915 - val_accuracy: 0.5051\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 4s 77us/sample - loss: 0.2890 - accuracy: 0.5082 - val_loss: 0.2904 - val_accuracy: 0.5051\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 4s 72us/sample - loss: 0.2878 - accuracy: 0.5083 - val_loss: 0.2890 - val_accuracy: 0.5052\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 4s 78us/sample - loss: 0.2868 - accuracy: 0.5084 - val_loss: 0.2882 - val_accuracy: 0.5054\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 4s 71us/sample - loss: 0.2859 - accuracy: 0.5085 - val_loss: 0.2872 - val_accuracy: 0.5054\n"
     ]
    }
   ],
   "source": [
    "stacked_ae_1_by_1.compile(loss=\"binary_crossentropy\", optimizer=keras.optimizers.SGD(lr=0.5),\n",
    "                          metrics=[\"accuracy\"])\n",
    "history = stacked_ae_1_by_1.fit(X_train, X_train, epochs=10, validation_data=[X_valid, X_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(stacked_ae_1_by_1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualizing the extracted features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure extracted_features_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x144 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "weights1 = stacked_ae_1_by_1.layers[1].get_weights()[0]\n",
    "plt.figure(figsize=(8, 2))\n",
    "n_rows, n_cols = 2, 8\n",
    "for row in range(n_rows):\n",
    "    for col in range(n_cols):\n",
    "        index = row * n_cols + col\n",
    "        plt.subplot(n_rows, n_cols, index + 1)\n",
    "        plt.imshow(weights1[:, index].reshape(28, 28), cmap=\"Greys\")\n",
    "        plt.axis(\"off\")\n",
    "\n",
    "save_fig(\"extracted_features_plot\", tight_layout=False) # not shown\n",
    "plt.show()                          # not shown"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using Convolutional Layers Instead of Dense Layers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's build a stacked Autoencoder with 3 hidden layers and 1 output layer (i.e., 2 stacked Autoencoders)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/5\n",
      "55000/55000 [==============================] - 40s 734us/sample - loss: 0.3017 - accuracy: 0.5064 - val_loss: 0.2842 - val_accuracy: 0.5058\n",
      "Epoch 2/5\n",
      "55000/55000 [==============================] - 39s 712us/sample - loss: 0.2756 - accuracy: 0.5088 - val_loss: 0.2739 - val_accuracy: 0.5058\n",
      "Epoch 3/5\n",
      "55000/55000 [==============================] - 39s 715us/sample - loss: 0.2709 - accuracy: 0.5092 - val_loss: 0.2720 - val_accuracy: 0.5059\n",
      "Epoch 4/5\n",
      "55000/55000 [==============================] - 39s 707us/sample - loss: 0.2682 - accuracy: 0.5094 - val_loss: 0.2685 - val_accuracy: 0.5063\n",
      "Epoch 5/5\n",
      "55000/55000 [==============================] - 39s 706us/sample - loss: 0.2665 - accuracy: 0.5095 - val_loss: 0.2671 - val_accuracy: 0.5066\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "conv_encoder = keras.models.Sequential([\n",
    "    keras.layers.Reshape([28, 28, 1], input_shape=[28, 28]),\n",
    "    keras.layers.Conv2D(16, kernel_size=3, padding=\"SAME\", activation=\"selu\"),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    keras.layers.Conv2D(32, kernel_size=3, padding=\"SAME\", activation=\"selu\"),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    keras.layers.Conv2D(64, kernel_size=3, padding=\"SAME\", activation=\"selu\"),\n",
    "    keras.layers.MaxPool2D(pool_size=2)\n",
    "])\n",
    "conv_decoder = keras.models.Sequential([\n",
    "    keras.layers.Conv2DTranspose(32, kernel_size=3, strides=2, padding=\"VALID\", activation=\"selu\",\n",
    "                                 input_shape=[3, 3, 64]),\n",
    "    keras.layers.Conv2DTranspose(16, kernel_size=3, strides=2, padding=\"SAME\", activation=\"selu\"),\n",
    "    keras.layers.Conv2DTranspose(1, kernel_size=3, strides=2, padding=\"SAME\", activation=\"sigmoid\"),\n",
    "    keras.layers.Reshape([28, 28])\n",
    "])\n",
    "conv_ae = keras.models.Sequential([conv_encoder, conv_decoder])\n",
    "\n",
    "conv_ae.compile(loss=\"binary_crossentropy\", optimizer=keras.optimizers.SGD(lr=1.0),\n",
    "                metrics=[\"accuracy\"])\n",
    "history = conv_ae.fit(X_train, X_train, epochs=5,\n",
    "                      validation_data=[X_valid, X_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_16\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "reshape_3 (Reshape)          (None, 28, 28, 1)         0         \n",
      "_________________________________________________________________\n",
      "conv2d (Conv2D)              (None, 28, 28, 16)        160       \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 14, 14, 16)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 14, 14, 32)        4640      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 7, 7, 32)          0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 7, 7, 64)          18496     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 3, 3, 64)          0         \n",
      "=================================================================\n",
      "Total params: 23,296\n",
      "Trainable params: 23,296\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "Model: \"sequential_17\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d_transpose (Conv2DTran (None, 7, 7, 32)          18464     \n",
      "_________________________________________________________________\n",
      "conv2d_transpose_1 (Conv2DTr (None, 14, 14, 16)        4624      \n",
      "_________________________________________________________________\n",
      "conv2d_transpose_2 (Conv2DTr (None, 28, 28, 1)         145       \n",
      "_________________________________________________________________\n",
      "reshape_4 (Reshape)          (None, 28, 28)            0         \n",
      "=================================================================\n",
      "Total params: 23,233\n",
      "Trainable params: 23,233\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "conv_encoder.summary()\n",
    "conv_decoder.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAawAAAFqCAYAAABGeW4FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAHVBJREFUeJzt3V9sl+X5x/G7/CmlLbS0FAuV8icDQR1DiIbo1B24ZYpbnBqNMQs70BijJ8ZsZgdbPPPELR4QEzwx/jnyT6aROVDZogZUtogKCAGBQsu/QgulhVIt8jvaL4brc437Sf98e337fh1eee7nefrlez+Xj/f1ve6KixcvJgAAxroJpb4BAABykLAAACGQsAAAIZCwAAAhkLAAACGQsAAAIZCwAAAhkLAAACFMKtF1+bUyhltFqW9gHGM+Y7jJ+cwbFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACCESaW+AYwN33//vYlVVFTIY734pQYHB2V80iT7tevq6jKxxsbGrOsA5ebixYvZx+bOx5GSe6/DcZ+8YQEAQiBhAQBCIGEBAEIgYQEAQiBhAQBCoEpwjBhqVVBvb6+J7dy5U45fsWKFiVVWVmZfP5eqBvSsX7/exNasWTOctwOMSWruf/fddyZ24cIFOV7N3YkTJw79xi7hPaP6+/tNTFUd19bWDvkeeMMCAIRAwgIAhEDCAgCEQMICAIRA0cUYVqSVyZdffmliH374oTy2o6PDxO699978G8t09uxZGf/3v/9tYvX19cN+fWAs8YoWBgYGTOzgwYMmtmPHDjl+4cKFJjZ//nwTmzZtmhw/YYJ9b1H3eubMGTn+97//vYmptmrPPPNM9vU9vGEBAEIgYQEAQiBhAQBCIGEBAEKoKNJhYRiV5KJjmfpluLcYqRZkVaeImpqa7PGHDh0yMW8/KvXL9gULFpjYiRMn5Hi1eNva2mpiTz31lBzvKO2mQOMb8zmD6l6RUkrHjh0zsb///e8mtnXrVjm+rq7OxNR8nDdvXvZ9qbm7efNmOf4f//iHiakiql27dsnxTpcdOZ95wwIAhEDCAgCEQMICAIRAwgIAhEDCAgCEQGumElCVmaoi8Ntvv5XjX3/9dROrqqoysXPnzsnxqkpP3ZOqXPSO/eqrr0zMq0pqaGgwMa+CCohIzRGvVdnhw4dN7Pz58yY2derU7Gup/fHeeecdOb6vr8/EJk+ebGI9PT1y/A033GBizc3NJlak1ZyHNywAQAgkLABACCQsAEAIJCwAQAjjsuhCLVJ6C4K5rau88UVaLl3qjTfekPGWlhYTq66uNrG9e/fK8WpBd/bs2SY2ODgox6v7r62tNTGn5YpcvFX35BWdeOcFSkE9I9T3ed++fXJ8W1ubiV24cMHEpkyZIsfn7mflzRt13jlz5piYKpZKKaWJEyeamNp7yyviKoI3LABACCQsAEAIJCwAQAgkLABACGVTdOEVR6hiiCK/uM491ltQzC2w+Pjjj02so6NDHrtq1SoTU4u0p06dkuNnzpyZFevs7JTj1a/ovQINRX1WqiuHt5+WKjoBRoN6zgwMDJjY9u3bTezAgQPynKrLi+o04e1vp6giKO8Z2dTUZGIzZswwMW+Oq/tXXT3U55SSX0yi8IYFAAiBhAUACIGEBQAIgYQFAAihbIouihRSqMXHoRZt5BZXpJTS+++/b2Jqe46FCxfK8aoYQd2/t73I3LlzTUx1n/D+JtVVQ/2yv8hnqnzwwQcyvmbNmqzxQI4izwNVYHDo0CET+/TTT01s0iT9uFVFB6rAwStOUB0s+vv7TUxtQeSdVxVdeJ+Jeh6poovdu3fL8ddff72Jec8I3rAAACGQsAAAIZCwAAAhkLAAACGQsAAAIYz5KsHc/aiKGGq7JkW1K0pJVwSqCpprr73WxM6cOSPPqSqAVBslb/8b9beqe/Ko/W9UpZFXFaXaxqiKxH/9619yPFWCuBzvuaFamKnKP28vtpMnT5qYark0ffp0E1OVdymldPz48ax78qj5ePjwYRPzPhP1t6o2St5noj5T1X5NtZ9LKaWVK1eamPqbUuINCwAQBAkLABACCQsAEAIJCwAQQkmKLtSCnNcGaKjFELm8Nkaq7UhbW5uJqfYsKel2KGrxtaury8S8/azU4qdqjeR9pmqRWC3y1tfXy/GqmENdSy3GpqRbO6lj1cJ1SikdO3bMxJqbm+WxGHlqMd+bt7ltkLzvjjo2d3+1lPR8Vt8n7/qqmEHNRzVeFVekpAumjhw5YmLe36T2yVKfiVcYpoqj1PPEK+JS/ybqnKr9XEr685s6dao8ljcsAEAIJCwAQAgkLABACCQsAEAIJSm6KLJ3lOrAoH5trro/eHG1oLh37145vq+vz8TU4mNdXZ0crxZfu7u7TUz9nZMnT5bnVMeqhVdv/xu1yNnS0mJiXtGHun5DQ4OJeYu86u9X3S+OHj0qx6vzUnRROrmFECnpDgoqpgohUtLfPTXHdu3aJcerDgozZ840MW/uqL9L3b96RhXZY0s9I71CBPU8y91jKyX9majilKamJjlezWdVNFLkeULRBQAgNBIWACAEEhYAIAQSFgAgBBIWACCEMbMf1tdffy3jqp2Jqmrx2p6oyhjVNsSryFPtiXp6ekysvb1djleVQaqqp7Gx0cS89jCqSk79naryLqWUpk2bZmKqXZRXqZVL/U0p6X8/1XbGq/z09spBaaiqU1VllpJua6bmozefVcsnNUe9uaPmuarI8/aHU3NPVQ6qyj9vfzh1TlWJ7D2j1Nz39q5SVJWjem55VX7q71fPOFU5mZJ+nqrKzZR4wwIABEHCAgCEQMICAIRAwgIAhFCSoosdO3aY2PPPPy+Pveaaa0ystbXVxLy9m9Tiq2pbUmT/HXUttciYki4QOH36dNZ1vIVftUisFj691kaqmEL9m3h/k/dZXcrbz0otMqvWUt54798apaGKYzZu3CiPVW181L+z10ZIFRPMmTPHxLy5o+Kq6MCbO6qYRM0Htb+d971V11d/vypOSCl/PytvPyp1fdUaybt/1ZZOfc6qEOV/xRXesAAAIZCwAAAhkLAAACGQsAAAIZSk6OJHP/qRiS1btkweu23bNhP78MMPs6+lFiRVpwfvl9WqW4Pa+8krUFDFFGrhVu3fo/biSkn/YlwVYmzZskWOX7VqlYktWbLExDZs2CDHq79VdSDwqF/sz58/38S8fxPVFUP9m2B0qO+et3fSF198YWKqMMnr1KAKlorMR/U8UEVYXoGD6sChigZU5xhvjy71jFFFSN49qXly4MABE1N7VKWkCyzUs8fb3051KVKfSZH9/Ty8YQEAQiBhAQBCIGEBAEIgYQEAQiBhAQBCqFBVbKNgSBdVFUT79u2Tx+7Zs8fE/vnPf5pYZ2enHK/2gMltrZSSrp5TVVGzZ882sauvvlqec/Xq1Sa2cuVKE/P238n1u9/9Tsb37t1rYi0tLSamqjFT0q141L1WVVXJ8X/6059MrLKyMr9MEcNqcHDQfPlVq7CUdJXdmTNnTMzbi+21114zMVXlV6StmGqDpCofU9JtqNS1rrvuOhPzqn7vueceE7vqqqtMzNsHTsU3bdpkYmvXrpXjVZWlmnuLFi2S49Vnoub+j3/8Yzn+Zz/7mYlVV1fL+cwbFgAgBBIWACAEEhYAIAQSFgAghJBFF4BA0UWJXBQPEa9V11CfN6qYQ8W8PdtUMYW6V69oRMVV0YMqIvI+kyJtzXKpz7nIZ1/knnKPLVKYlpz5zBsWACAEEhYAIAQSFgAgBBIWACAEii5QLii6KB3mM4YbRRcAgLhIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAECaV6LoVJbougOHHfMao4A0LABACCQsAEAIJCwAQAgkLABACCQsAEAIJCwAQAgkLABACCQsAEAIJCwAQAgkLABACCQsAEAIJCwAQAgkLABACCQsAEAIJCwAQAgkLABACCQsAEAIJCwAQAgkLABACCQsAEAIJCwAQAgkLABACCQsAEAIJCwAQAgkLABACCQsAEAIJCwAQAgkLABACCQsAEMKkEl33YomuO2IGBgZkfP/+/Sa2dOnSYb9+e3u7iU2dOlUeO3PmzGG//hhQUeobGMfCzOeLF+2tfv/99ybW398vx6t5NmPGDBOrrq42sQkT9PtBX1+fiZ07d87EvPnc2NhoYpMm2Ue7d/0xSs7nUH8BAGD8ImEBAEIgYQEAQijVGtaYMzg4KOOvvvqqia1bt87Ejh8/LscfO3bMxGpqakzs5MmTl7vF/0n9/231/9FT0v9/+9e//rWJPf7443L8smXLCt4dMLq+/fZbGX/jjTdM7O233zaxTz/9VI7v6urKuv60adNMrLW1VR57+PBhE+vu7jYx9dxIKaXbbrvNxG6//XYT++UvfynHqzXtsbreNTbvCgCAS5CwAAAhkLAAACGQsAAAIZCwAAAhVKhffo+Ckv4y/tlnnzWxZ555Rh7b09NjYqr6zqvgqaysNLGzZ8+amOqUoX6Bn1JKU6ZMMbHa2loTu3Dhghx//vx5E1O/rPcqJ++44w4TU5VWo4xOF6UzavNZzYm//OUvJuZ9H7/88ksTU/OhyPUrKuxXb+LEiSamKge966sqR28+T58+3cSqqqpMzHtGLVq0yMRUNaU3foTQ6QIAEBcJCwAQAgkLABACCQsAEELZF128++67JrZ69WoTa2lpkeNVGyO1yOp9jmrxVJ1TUdfx4t99913WOb3xkydPNjG1cJxSSm1tbSb24IMPmthLL72UfU/DgKKL0hm1+bx161YTU/O5SCGFmo/edz93exJ1nCqW8q6l5rO3hZHaXkTN5xMnTsjxvb29Jnb//febmGpTl5L/nBoiii4AAHGRsAAAIZCwAAAhkLAAACGUfdHFnDlzTKy/v9/E1K/FU9K/Llf713jUgqj6FbpaJFWLoSnp+29qajIxr1OGWuRVi9Ted0MtHp85c8bEvM/J26driCi6KJ1Rm8/33HOPiW3YsMHE1HxKSe8bpzpQeN9RVWCgOsKo/e3UvE9JPyNUIYi3x9dVV12VdU9btmyR448cOWJiqnOON5+9Z+cQUXQBAIiLhAUACIGEBQAIgYQFAAiBhAUACCGvR1Bgp06dMjFVrePtNaMqY/785z+b2COPPCLHt7a2mtiVV15pYqrdUV1dnTyn2r+mo6PDxLxWMO3t7SY2b948E/MqpdRnqvb48lrBqGsBP+RVqO7evdvE1J5zqhowpfw2TN74+vp6E1PPE1VN6O0ntWLFChNT+/B5rZnU8+DYsWMmpiqmU9IVwqo1lLqnlEasSlDiDQsAEAIJCwAQAgkLABACCQsAEELZF12oBUW1oFqkRdUf//hHE/ParqhiDlWgcPfdd5vYm2++mX1PauF227Zt8lj1mbzyyism9vDDD8vxzc3NJqbaQHmtYCi6wOV48/Ho0aMmNmGC/e9uVYiRki4kUsVNy5cvl+NVGydVDKGuv2TJEnnOBx54wMTUHPWKHlQhyaZNm0xs+/btcrxqw6Q+/yJ7jI0U3rAAACGQsAAAIZCwAAAhkLAAACGUTdGF16lCUYu0RRYUH330URN78cUXs8ervXJUgcXatWvl+BkzZpjY+vXrTUztUZWS7lTxm9/8xsS8ogtVYKG6BWzdulWOV4vMwA95e7mpPaFUgYM3n1XBldo7a/HixXJ8Q0ODiamOLmqO3nrrrfKcLS0tJqaKHrz9sNTfet1115nY66+/nj1edcn55ptv5HjVaWOk8IYFAAiBhAUACIGEBQAIgYQFAAiBhAUACKFsqgR7e3uzj1UVbapdkkftXVXEJ598knWcV02nqppUVZG3/01fX1/WOYdq165dw35OjA9eRZxqg6Qq2tR+Tinp6kO1n9MVV1whx8+dO9fEGhsbTez48eMm5rWbUvc6ODhoYl7lo3qeqXZTXuWleh6oe3rvvffk+Ntvv13GRwJvWACAEEhYAIAQSFgAgBBIWACAEMqm6MLbKyaXt8irihH27t1rYkX201q2bFnWcT/96U9lfPfu3SY2a9YsE/NaI11zzTUmdvPNN5uY2vsnJd0GS31O+/fvl+OBy/EKDNTeT0XaGJ0+fdrEVMHWnj175PjDhw+bmGqtVFFRYWKqhVNKKXV3d5uYKrrYuXOnHL9w4cKsa3nzWRVtqGNVIUlK+vNXf/9w4A0LABACCQsAEAIJCwAQAgkLABBC2RRddHZ2Zh/r/eJbqa2tNTG18OotMqoFSbUg+vTTT5tYkU4Rav8br+hBfVYvv/yyiW3YsEGOnzlzpompbgND7QiC8cubz6pAQMW8zi01NTUmVl1dbWJegYF6Hijq+t7+dDt27DCxc+fOmdi+ffvkeBVXe/4VeUap+az28fPGU3QBABjXSFgAgBBIWACAEEhYAIAQSFgAgBDKpkrQq2BRVFWRajeUkt4XRrUtee6557LHv/XWWya2ZcsWE9u2bZs8Z1dXl4l98cUXJrZmzRo5XlUP/uc//5HHKuqzUlVJ3p5EwOV4bcUU9T1TlX8p6Yo21eqso6NDjl+6dGn2sZfyKhdVqzdVSazmvXfsbbfdZmJelaJqY6VaY3lVx2p8VVWVPHaoeMMCAIRAwgIAhEDCAgCEQMICAIRQNkUXBw8ezD5WFQh47ZrUvjQzZswwsSeeeCL7+mr8nDlzTOyzzz7LPqfak+fo0aPyWG/x91JeexX1mVRWVmadMyX9Wat/E4xfqv1ZSrrgJ7e1UEq6rVh7e7uJqcKslFI6dOiQian5MDAwYGJNTU3ynHV1dSam5q53T2o/r76+PhObN2+eHK/2/lJ/k/c8KNLqbqh4SgAAQiBhAQBCIGEBAEIgYQEAQiibogtv/5pcXtHAvffea2Jvv/22ic2fP1+OVwul6pfh6tf69fX18pyKOqcqxEhJ/4pdLfx6i8SbN282sVmzZl3uFv/f6dOnTayhoSF7PMrfqVOnZFwt/KtFf28+Ll682MRU0cX06dPlePU97e7uNrEiRRPqb1JdKdReXt55GxsbTcyboxs3bjSx3A4/Kemil5HCGxYAIAQSFgAgBBIWACAEEhYAIISyKbrwFmkVtaC5cOFCeeyjjz5qYq+++qqJ1dbWZl9fLRKrhcsi23OohVtvvCq6mDTJfhWefPJJOV4VXRShPn+KLvBD3pYd6nuu5s7y5cvl+NmzZ2eN9zplqHmutic5e/asiak5lpIumFJUl46UUjp37pyJTZ061cRuvPFGOf6vf/2rialCDq+4YjS3EeINCwAQAgkLABACCQsAEAIJCwAQAgkLABBC2VQJdnV1ybiqKlIVPHPnzpXjVcsixWvtpCpovH1lhkKdU+0d5B2r9u/xqopyz1ldXS2PHc39cxCTqnxLKf97rvacS0m3O1Nz1HueqH3bVKsxdU713PGOVZW8J06ckOP7+/tNbNOmTSam2lJ5enp6TMzbs05VaBdpK1cEb1gAgBBIWACAEEhYAIAQSFgAgBDKvuiiqqrKxNQipbdIuGvXrqzrD7XtylALMVTbFO+cKq729ClyT+r6XnGFWqQGfmj//v0yrr5TqmhBtUtKSe9TpVqFqdZG3vVVMYKKefNJzR1VoOHtp6X+/p07d5qYV7Sh7qtIEZc674IFC+SxQ8UbFgAgBBIWACAEEhYAIAQSFgAghLIpuhgcHJTx3MKBpUuXynhu0YX3K3C1SJu7p08R6pzeZ6IKUdSv1b1uAYq6lld04RXIAP/ldY5RcVXY5O0dNW3aNBMrUlzkdeDIUWQ/KVXg4O25pz6TIs8T9exS1/eKLlRXjJHCGxYAIAQSFgAgBBIWACAEEhYAIAQSFgAghLKpElSVNin57Uwude2118r4e++9N6TrK6qCp0hrpdxzelV6kydPzjqnVyU4f/58E+vs7Mw6Z0qjW1WEmKZMmSLjqgWaqnpdtWqVHP/VV1+ZmKqSU+dMSe9TpZ4xao5551TPDjXeq0RWn5Wq6CtSOdnb22ti3vPowIEDMj4SeMMCAIRAwgIAhEDCAgCEQMICAIRQNkUXNTU1Mu7tU3Upb0Fz27ZtJqYWRL0Ch5GgFlRz9+RJKb8Q5fjx4zKu9rrp6OgwMW/hvK+vL+v6GL+8FkiqBZj6nqv9pFLS+0SpgiXv+qpAQt1TkVZp6v7V3CmyR5fac87bD6u1tdXE9uzZk3VP3rVGCm9YAIAQSFgAgBBIWACAEEhYAIAQyqbowuve4C10XkrtqZNSSkePHjUxtS9N7nWKKNLpQvGKK7x9bS71t7/9TcYXLVpkYh999JGJefd/8uTJrOtj/GpoaJDxtrY2E1Pf5+bmZjle7fumeM8T9ZzI3d/OKwBT11JFI958yi2i8q6vPmtVXDLUIq7hwBsWACAEEhYAIAQSFgAgBBIWACAEEhYAIISyqRL0KmD6+/uzxqt9clJKaWBgwMTUvjZF2q6oCiLFOy53vCe3onH//v0yvnLlShN74YUXTMyraiqydxjGJ6/KT32n1Bzz9nJTc0dV6VVWVsrxqg2Sevao73hLS4s8p3qeqNZQXmuk3Co9r33dLbfcYmKff/65iXmtoZYuXZp1/eHAGxYAIAQSFgAgBBIWACAEEhYAIISyKbrwFklzCxS6u7tlPHfx02tbouQe6xUtqHhuexgvrhapN27cKMfnLrJ6f6e31xDwX0VaIyne3FHfPXWt+vp6OV7t/aTGq/v09o3K3fvKK7qorq42MfU87O3tleNnzZplYuoZ4X323r/VSOANCwAQAgkLABACCQsAEAIJCwAQQtkUXXgLf2pBUi0+PvXUU3L8m2++aWJq4Xaoe8Lk/oI/Jf1re8Xb90rdq1oQvuuuu+T4O++808Qee+yxrOukpLuHAD/kfffVwr/qFOF999XcV8ceOXJEjledc9R49R339uJSzy5V9OAVhqnx6hm1fv16OX7x4sUmlvs5pZTS9u3bTeznP/+5PHaoeMMCAIRAwgIAhEDCAgCEQMICAIRAwgIAhFA2VYJeux+1V42qqvEqYGbPnm1iO3bsMDGvXZF33hxF9r1SlYNelZ5q23Ly5EkTu+KKK+T46dOnZ92Tt0dZW1tb1niMX2repaS/U+q7f+WVV8rxDz30kIlt3rw5+746OjpMrLOz08Rqa2tNrK6uTp5zxYoVJtbe3m5iXV1dcrx6Tqiq41/96ldy/PLly01s3bp1JuZVJ+furzcceMMCAIRAwgIAhEDCAgCEQMICAIRQNkUXt9xyi4y/++67JqbaNXmLvKrtyHinWsyoBWWvEGbVqlXDfk8oL42NjTKuConUXm5z586V4//whz+YmCpaKLKXnIqp+yyyZ14R6vrnz583MW8/LdVGqrm52cTUczOllH7yk59c7haHDW9YAIAQSFgAgBBIWACAEEhYAIAQyqbo4qabbpLxs2fPmpjq9KB+GQ5N/bJd7ROk9i5KKb9TBsavgwcPyrj67hXZX22kCh9KST27VIFEkUISVbThfc6q888vfvGLrPssqvz+9QAAZYmEBQAIgYQFAAiBhAUACIGEBQAIoWyqBJuammRctWyqqakxMbVHlkftCxO9ylBVCnkVVaptzm9/+1sT6+npkeO9ik7gv+677z4Z37dvn4ktWbLExLy94MYz7xmlWjbdf//9JtbX1yfHq4rAkcIbFgAgBBIWACAEEhYAIAQSFgAghAqvXQcAAGMJb1gAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEEhYAIAQSFgAgBBIWACAEP4P32QIpdBgwlQAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(conv_ae)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Unsupervised pretraining"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's create a small neural network for MNIST classification:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 500 samples, validate on 5000 samples\n",
      "Epoch 1/20\n",
      "500/500 [==============================] - 1s 3ms/sample - loss: 2.1965 - accuracy: 0.2480 - val_loss: 2.0234 - val_accuracy: 0.3148\n",
      "Epoch 2/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 1.7927 - accuracy: 0.5180 - val_loss: 1.5677 - val_accuracy: 0.6280\n",
      "Epoch 3/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 1.3931 - accuracy: 0.6360 - val_loss: 1.2556 - val_accuracy: 0.5482\n",
      "Epoch 4/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 1.1168 - accuracy: 0.6620 - val_loss: 0.9990 - val_accuracy: 0.6892\n",
      "Epoch 5/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.9421 - accuracy: 0.7360 - val_loss: 1.1235 - val_accuracy: 0.6208\n",
      "Epoch 6/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.8392 - accuracy: 0.7240 - val_loss: 0.8985 - val_accuracy: 0.6778\n",
      "Epoch 7/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.7738 - accuracy: 0.7400 - val_loss: 0.7833 - val_accuracy: 0.7296\n",
      "Epoch 8/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.7472 - accuracy: 0.7380 - val_loss: 0.7364 - val_accuracy: 0.7396\n",
      "Epoch 9/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.6908 - accuracy: 0.7580 - val_loss: 0.8782 - val_accuracy: 0.6802\n",
      "Epoch 10/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.6740 - accuracy: 0.7640 - val_loss: 0.7064 - val_accuracy: 0.7454\n",
      "Epoch 11/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.6431 - accuracy: 0.7700 - val_loss: 0.8587 - val_accuracy: 0.6848\n",
      "Epoch 12/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.6301 - accuracy: 0.7740 - val_loss: 0.6704 - val_accuracy: 0.7584\n",
      "Epoch 13/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5834 - accuracy: 0.8040 - val_loss: 0.7229 - val_accuracy: 0.7302\n",
      "Epoch 14/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5612 - accuracy: 0.8220 - val_loss: 0.6370 - val_accuracy: 0.7734\n",
      "Epoch 15/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5845 - accuracy: 0.7960 - val_loss: 0.6511 - val_accuracy: 0.7592\n",
      "Epoch 16/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5488 - accuracy: 0.8080 - val_loss: 0.7779 - val_accuracy: 0.7014\n",
      "Epoch 17/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5362 - accuracy: 0.8160 - val_loss: 0.6632 - val_accuracy: 0.7636\n",
      "Epoch 18/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5064 - accuracy: 0.8180 - val_loss: 0.7703 - val_accuracy: 0.6954\n",
      "Epoch 19/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5147 - accuracy: 0.8240 - val_loss: 0.6980 - val_accuracy: 0.7390\n",
      "Epoch 20/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5151 - accuracy: 0.8160 - val_loss: 0.7014 - val_accuracy: 0.7374\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "X_train_small = X_train[:500]\n",
    "y_train_small = y_train[:500]\n",
    "\n",
    "classifier = keras.models.Sequential([\n",
    "    keras.layers.Reshape([28, 28, 1], input_shape=[28, 28]),\n",
    "    keras.layers.Conv2D(16, kernel_size=3, padding=\"SAME\", activation=\"selu\"),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    keras.layers.Conv2D(32, kernel_size=3, padding=\"SAME\", activation=\"selu\"),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    keras.layers.Conv2D(64, kernel_size=3, padding=\"SAME\", activation=\"selu\"),\n",
    "    keras.layers.MaxPool2D(pool_size=2),\n",
    "    keras.layers.Flatten(),\n",
    "    keras.layers.Dense(20, activation=\"selu\"),\n",
    "    keras.layers.Dense(10, activation=\"softmax\")\n",
    "])\n",
    "classifier.compile(loss=\"sparse_categorical_crossentropy\", optimizer=keras.optimizers.SGD(lr=0.02), metrics=[\"accuracy\"])\n",
    "history = classifier.fit(X_train_small, y_train_small, epochs=20, validation_data=[X_valid, y_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "pd.DataFrame(history.history).plot()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "conv_encoder_clone = keras.models.clone_model(conv_encoder)\n",
    "\n",
    "pretrained_clf = keras.models.Sequential([\n",
    "    conv_encoder_clone,\n",
    "    keras.layers.Flatten(),\n",
    "    keras.layers.Dense(20, activation=\"selu\"),\n",
    "    keras.layers.Dense(10, activation=\"softmax\")\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 500 samples, validate on 5000 samples\n",
      "Epoch 1/30\n",
      "500/500 [==============================] - 1s 3ms/sample - loss: 2.3174 - accuracy: 0.1820 - val_loss: 2.2350 - val_accuracy: 0.2156\n",
      "Epoch 2/30\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 2.1829 - accuracy: 0.2760 - val_loss: 2.1267 - val_accuracy: 0.3650\n",
      "Epoch 3/30\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 2.0852 - accuracy: 0.3880 - val_loss: 2.0370 - val_accuracy: 0.4378\n",
      "Epoch 4/30\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 1.9953 - accuracy: 0.4500 - val_loss: 1.9513 - val_accuracy: 0.5028\n",
      "Epoch 5/30\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 1.9117 - accuracy: 0.5860 - val_loss: 1.8742 - val_accuracy: 0.5610\n",
      "Epoch 6/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.8310 - accuracy: 0.6180 - val_loss: 1.7963 - val_accuracy: 0.6242\n",
      "Epoch 7/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.7526 - accuracy: 0.6760 - val_loss: 1.7218 - val_accuracy: 0.6440\n",
      "Epoch 8/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.6823 - accuracy: 0.6760 - val_loss: 1.6525 - val_accuracy: 0.6682\n",
      "Epoch 9/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.6132 - accuracy: 0.7020 - val_loss: 1.5936 - val_accuracy: 0.6430\n",
      "Epoch 10/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.5521 - accuracy: 0.6960 - val_loss: 1.5257 - val_accuracy: 0.6844\n",
      "Epoch 11/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.4915 - accuracy: 0.7180 - val_loss: 1.4718 - val_accuracy: 0.6688\n",
      "Epoch 12/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.4381 - accuracy: 0.7200 - val_loss: 1.4196 - val_accuracy: 0.6832\n",
      "Epoch 13/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.3849 - accuracy: 0.7180 - val_loss: 1.3708 - val_accuracy: 0.6798\n",
      "Epoch 14/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.3376 - accuracy: 0.7180 - val_loss: 1.3270 - val_accuracy: 0.6852\n",
      "Epoch 15/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.2971 - accuracy: 0.7320 - val_loss: 1.2876 - val_accuracy: 0.6846\n",
      "Epoch 16/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.2556 - accuracy: 0.7380 - val_loss: 1.2488 - val_accuracy: 0.6976\n",
      "Epoch 17/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.2174 - accuracy: 0.7240 - val_loss: 1.2141 - val_accuracy: 0.6938\n",
      "Epoch 18/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.1855 - accuracy: 0.7300 - val_loss: 1.1859 - val_accuracy: 0.6938\n",
      "Epoch 19/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.1551 - accuracy: 0.7400 - val_loss: 1.1562 - val_accuracy: 0.6982\n",
      "Epoch 20/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.1256 - accuracy: 0.7300 - val_loss: 1.1256 - val_accuracy: 0.7016\n",
      "Epoch 21/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.0985 - accuracy: 0.7520 - val_loss: 1.0996 - val_accuracy: 0.7064\n",
      "Epoch 22/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.0735 - accuracy: 0.7400 - val_loss: 1.0756 - val_accuracy: 0.7142\n",
      "Epoch 23/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.0494 - accuracy: 0.7560 - val_loss: 1.0562 - val_accuracy: 0.7066\n",
      "Epoch 24/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.0259 - accuracy: 0.7480 - val_loss: 1.0377 - val_accuracy: 0.7034\n",
      "Epoch 25/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 1.0079 - accuracy: 0.7440 - val_loss: 1.0139 - val_accuracy: 0.7174\n",
      "Epoch 26/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 0.9860 - accuracy: 0.7420 - val_loss: 0.9959 - val_accuracy: 0.7224\n",
      "Epoch 27/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 0.9691 - accuracy: 0.7440 - val_loss: 0.9819 - val_accuracy: 0.7180\n",
      "Epoch 28/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 0.9526 - accuracy: 0.7600 - val_loss: 0.9638 - val_accuracy: 0.7238\n",
      "Epoch 29/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 0.9365 - accuracy: 0.7600 - val_loss: 0.9512 - val_accuracy: 0.7236\n",
      "Epoch 30/30\n",
      "500/500 [==============================] - 1s 1ms/sample - loss: 0.9203 - accuracy: 0.7600 - val_loss: 0.9364 - val_accuracy: 0.7244\n"
     ]
    }
   ],
   "source": [
    "conv_encoder_clone.trainable = False\n",
    "pretrained_clf.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "                       optimizer=keras.optimizers.SGD(lr=0.02),\n",
    "                       metrics=[\"accuracy\"])\n",
    "history = pretrained_clf.fit(X_train_small, y_train_small, epochs=30,\n",
    "                             validation_data=[X_valid, y_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 500 samples, validate on 5000 samples\n",
      "Epoch 1/20\n",
      "500/500 [==============================] - 1s 3ms/sample - loss: 0.8479 - accuracy: 0.7360 - val_loss: 0.8023 - val_accuracy: 0.7154\n",
      "Epoch 2/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.7508 - accuracy: 0.7480 - val_loss: 0.7908 - val_accuracy: 0.7062\n",
      "Epoch 3/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.6956 - accuracy: 0.7700 - val_loss: 0.8156 - val_accuracy: 0.7006\n",
      "Epoch 4/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.6806 - accuracy: 0.7700 - val_loss: 0.7408 - val_accuracy: 0.7244\n",
      "Epoch 5/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.6563 - accuracy: 0.7700 - val_loss: 0.6731 - val_accuracy: 0.7540\n",
      "Epoch 6/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.6262 - accuracy: 0.7920 - val_loss: 0.7332 - val_accuracy: 0.7316\n",
      "Epoch 7/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.6039 - accuracy: 0.7860 - val_loss: 0.6458 - val_accuracy: 0.7592\n",
      "Epoch 8/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5875 - accuracy: 0.7800 - val_loss: 0.8370 - val_accuracy: 0.6970\n",
      "Epoch 9/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5720 - accuracy: 0.8000 - val_loss: 0.6247 - val_accuracy: 0.7724\n",
      "Epoch 10/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5601 - accuracy: 0.8140 - val_loss: 0.6436 - val_accuracy: 0.7524\n",
      "Epoch 11/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5256 - accuracy: 0.8300 - val_loss: 0.6169 - val_accuracy: 0.7738\n",
      "Epoch 12/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5029 - accuracy: 0.8260 - val_loss: 0.6318 - val_accuracy: 0.7672\n",
      "Epoch 13/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.4956 - accuracy: 0.8340 - val_loss: 0.6539 - val_accuracy: 0.7548\n",
      "Epoch 14/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.4754 - accuracy: 0.8360 - val_loss: 0.6640 - val_accuracy: 0.7598\n",
      "Epoch 15/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.5025 - accuracy: 0.8240 - val_loss: 0.6049 - val_accuracy: 0.7762\n",
      "Epoch 16/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.4462 - accuracy: 0.8440 - val_loss: 0.5851 - val_accuracy: 0.7882\n",
      "Epoch 17/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.4607 - accuracy: 0.8400 - val_loss: 0.6206 - val_accuracy: 0.7706\n",
      "Epoch 18/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.4216 - accuracy: 0.8580 - val_loss: 0.6025 - val_accuracy: 0.7800\n",
      "Epoch 19/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.4308 - accuracy: 0.8460 - val_loss: 0.6109 - val_accuracy: 0.7702\n",
      "Epoch 20/20\n",
      "500/500 [==============================] - 1s 2ms/sample - loss: 0.4044 - accuracy: 0.8580 - val_loss: 0.5820 - val_accuracy: 0.7902\n"
     ]
    }
   ],
   "source": [
    "conv_encoder_clone.trainable = True\n",
    "pretrained_clf.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "                       optimizer=keras.optimizers.SGD(lr=0.02),\n",
    "                       metrics=[\"accuracy\"])\n",
    "history = pretrained_clf.fit(X_train_small, y_train_small, epochs=20,\n",
    "                             validation_data=[X_valid, y_valid])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Stacked denoising Autoencoder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using Gaussian noise:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 5s 82us/sample - loss: 0.3772 - accuracy: 0.4927 - val_loss: 0.3322 - val_accuracy: 0.4955\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 4s 72us/sample - loss: 0.3364 - accuracy: 0.5007 - val_loss: 0.3207 - val_accuracy: 0.4994\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 4s 75us/sample - loss: 0.3314 - accuracy: 0.5013 - val_loss: 0.3197 - val_accuracy: 0.4984\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 4s 76us/sample - loss: 0.3290 - accuracy: 0.5017 - val_loss: 0.3153 - val_accuracy: 0.5003\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 4s 73us/sample - loss: 0.3271 - accuracy: 0.5020 - val_loss: 0.3146 - val_accuracy: 0.5018\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 4s 73us/sample - loss: 0.3258 - accuracy: 0.5022 - val_loss: 0.3124 - val_accuracy: 0.5011\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 4s 74us/sample - loss: 0.3248 - accuracy: 0.5023 - val_loss: 0.3116 - val_accuracy: 0.5010\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 4s 74us/sample - loss: 0.3237 - accuracy: 0.5025 - val_loss: 0.3098 - val_accuracy: 0.5009\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 4s 79us/sample - loss: 0.3229 - accuracy: 0.5026 - val_loss: 0.3103 - val_accuracy: 0.5024\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 4s 77us/sample - loss: 0.3223 - accuracy: 0.5028 - val_loss: 0.3085 - val_accuracy: 0.5018\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "denoising_encoder = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.GaussianNoise(1.0),\n",
    "    keras.layers.Dense(100, activation=\"selu\"),\n",
    "    keras.layers.Dense(30, activation=\"selu\")\n",
    "])\n",
    "denoising_decoder = keras.models.Sequential([\n",
    "    keras.layers.Dense(100, activation=\"selu\", input_shape=[30]),\n",
    "    keras.layers.Dense(28 * 28, activation=\"sigmoid\"),\n",
    "    keras.layers.Reshape([28, 28])\n",
    "])\n",
    "denoising_ae = keras.models.Sequential([denoising_encoder, denoising_decoder])\n",
    "denoising_ae.compile(loss=\"binary_crossentropy\", optimizer=keras.optimizers.SGD(lr=1.0),\n",
    "                     metrics=[\"accuracy\"])\n",
    "history = denoising_ae.fit(X_train, X_train, epochs=10,\n",
    "                           validation_data=[X_valid, X_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(denoising_ae)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using dropout:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 5s 83us/sample - loss: 0.3564 - accuracy: 0.4969 - val_loss: 0.3206 - val_accuracy: 0.5011\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 4s 72us/sample - loss: 0.3182 - accuracy: 0.5034 - val_loss: 0.3113 - val_accuracy: 0.5014\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 4s 75us/sample - loss: 0.3130 - accuracy: 0.5042 - val_loss: 0.3079 - val_accuracy: 0.5012\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 4s 71us/sample - loss: 0.3091 - accuracy: 0.5048 - val_loss: 0.3037 - val_accuracy: 0.5026\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 4s 73us/sample - loss: 0.3066 - accuracy: 0.5052 - val_loss: 0.3032 - val_accuracy: 0.5016\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 4s 75us/sample - loss: 0.3047 - accuracy: 0.5054 - val_loss: 0.3001 - val_accuracy: 0.5032\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 4s 74us/sample - loss: 0.3033 - accuracy: 0.5056 - val_loss: 0.2987 - val_accuracy: 0.5033\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.3021 - accuracy: 0.5057 - val_loss: 0.2976 - val_accuracy: 0.5033\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 4s 72us/sample - loss: 0.3012 - accuracy: 0.5058 - val_loss: 0.2976 - val_accuracy: 0.5033\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 4s 75us/sample - loss: 0.3004 - accuracy: 0.5059 - val_loss: 0.2958 - val_accuracy: 0.5033\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "dropout_encoder = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dropout(0.5),\n",
    "    keras.layers.Dense(100, activation=\"selu\"),\n",
    "    keras.layers.Dense(30, activation=\"selu\")\n",
    "])\n",
    "dropout_decoder = keras.models.Sequential([\n",
    "    keras.layers.Dense(100, activation=\"selu\", input_shape=[30]),\n",
    "    keras.layers.Dense(28 * 28, activation=\"sigmoid\"),\n",
    "    keras.layers.Reshape([28, 28])\n",
    "])\n",
    "dropout_ae = keras.models.Sequential([dropout_encoder, dropout_decoder])\n",
    "dropout_ae.compile(loss=\"binary_crossentropy\", optimizer=keras.optimizers.SGD(lr=1.0),\n",
    "                   metrics=[\"accuracy\"])\n",
    "history = dropout_ae.fit(X_train, X_train, epochs=10,\n",
    "                         validation_data=[X_valid, X_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(dropout_ae)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sparse Autoencoder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's build a simple stacked autoencoder, but this time we will use the sigmoid activation function for the coding layer, to ensure that the coding values range from 0 to 1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 4s 78us/sample - loss: 0.4331 - accuracy: 0.4906 - val_loss: 0.3778 - val_accuracy: 0.4911\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 4s 67us/sample - loss: 0.3610 - accuracy: 0.4976 - val_loss: 0.3510 - val_accuracy: 0.4972\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 4s 68us/sample - loss: 0.3405 - accuracy: 0.5006 - val_loss: 0.3359 - val_accuracy: 0.4990\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 4s 68us/sample - loss: 0.3276 - accuracy: 0.5027 - val_loss: 0.3248 - val_accuracy: 0.5003\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 4s 72us/sample - loss: 0.3206 - accuracy: 0.5035 - val_loss: 0.3206 - val_accuracy: 0.5007\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 4s 68us/sample - loss: 0.3172 - accuracy: 0.5038 - val_loss: 0.3176 - val_accuracy: 0.5010\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 4s 68us/sample - loss: 0.3149 - accuracy: 0.5041 - val_loss: 0.3154 - val_accuracy: 0.5013\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.3128 - accuracy: 0.5045 - val_loss: 0.3133 - val_accuracy: 0.5014\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 4s 68us/sample - loss: 0.3108 - accuracy: 0.5049 - val_loss: 0.3118 - val_accuracy: 0.5023\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 4s 71us/sample - loss: 0.3088 - accuracy: 0.5053 - val_loss: 0.3092 - val_accuracy: 0.5023\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "simple_encoder = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(100, activation=\"selu\"),\n",
    "    keras.layers.Dense(30, activation=\"sigmoid\"),\n",
    "])\n",
    "simple_decoder = keras.models.Sequential([\n",
    "    keras.layers.Dense(100, activation=\"selu\", input_shape=[30]),\n",
    "    keras.layers.Dense(28 * 28, activation=\"sigmoid\"),\n",
    "    keras.layers.Reshape([28, 28])\n",
    "])\n",
    "simple_ae = keras.models.Sequential([simple_encoder, simple_decoder])\n",
    "simple_ae.compile(loss=\"binary_crossentropy\", optimizer=keras.optimizers.SGD(lr=1.),\n",
    "                  metrics=[\"accuracy\"])\n",
    "history = simple_ae.fit(X_train, X_train, epochs=10,\n",
    "                        validation_data=[X_valid, X_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(simple_ae)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's create a couple functions to print nice activation histograms:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_percent_hist(ax, data, bins):\n",
    "    counts, _ = np.histogram(data, bins=bins)\n",
    "    widths = bins[1:] - bins[:-1]\n",
    "    x = bins[:-1] + widths / 2\n",
    "    ax.bar(x, counts / len(data), width=widths*0.8)\n",
    "    ax.xaxis.set_ticks(bins)\n",
    "    ax.yaxis.set_major_formatter(mpl.ticker.FuncFormatter(\n",
    "        lambda y, position: \"{}%\".format(int(np.round(100 * y)))))\n",
    "    ax.grid(True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_activations_histogram(encoder, height=1, n_bins=10):\n",
    "    X_valid_codings = encoder(X_valid).numpy()\n",
    "    activation_means = X_valid_codings.mean(axis=0)\n",
    "    mean = activation_means.mean()\n",
    "    bins = np.linspace(0, 1, n_bins + 1)\n",
    "\n",
    "    fig, [ax1, ax2] = plt.subplots(figsize=(10, 3), nrows=1, ncols=2, sharey=True)\n",
    "    plot_percent_hist(ax1, X_valid_codings.ravel(), bins)\n",
    "    ax1.plot([mean, mean], [0, height], \"k--\", label=\"Overall Mean = {:.2f}\".format(mean))\n",
    "    ax1.legend(loc=\"upper center\", fontsize=14)\n",
    "    ax1.set_xlabel(\"Activation\")\n",
    "    ax1.set_ylabel(\"% Activations\")\n",
    "    ax1.axis([0, 1, 0, height])\n",
    "    plot_percent_hist(ax2, activation_means, bins)\n",
    "    ax2.plot([mean, mean], [0, height], \"k--\")\n",
    "    ax2.set_xlabel(\"Neuron Mean Activation\")\n",
    "    ax2.set_ylabel(\"% Neurons\")\n",
    "    ax2.axis([0, 1, 0, height])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's use these functions to plot histograms of the activations of the encoding layer. The histogram on the left shows the distribution of all the activations. You can see that values close to 0 or 1 are more frequent overall, which is consistent with the saturating nature of the sigmoid function. The histogram on the right shows the distribution of mean neuron activations: you can see that most neurons have a mean activation close to 0.5. Both histograms tell us that each neuron tends to either fire close to 0 or 1, with about 50% probability each. However, some neurons fire almost all the time (right side of the right histogram)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnkAAADaCAYAAADaHlTIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XnclXP+x/HXp4U2FaWiIluRJVkng0oMJWYpMclIIdHQj2zZGrLXDGM3IqM09rFvIQwzRLaikNImCW1a1ef3x/e6b+c+3cs5p7Pf7+fjcR73Odd1nevz+Z7le3/P9/pe38vcHREREREpLjVynYCIiIiIpJ8aeSIiIiJFSI08ERERkSKkRp6IiIhIEVIjT0RERKQIqZEnIiIiUoTUyBMREREpQmrkiYiIiBQhNfJEREREilCtXCeQTY0bN/add945ozF++ukn6tevX/AxshUn0zFmzJgBQKtWrQq+LNmKka042Yjx/vvvL3b3rTMaJEuKpf7KVpxiKcuMGTNYv3497du3z1gMKJ7Xq5hiQBrqMHevNre2bdt6pr322mtFESNbcTIdo3Pnzt65c+eiKEu2YmQrTjZiAO95HtQ96bgVS/2VrTjFUpbOnTt7hw4dMhrDvXher2KK4b7pdZgO14qIiIgUITXyRERERIpQtRqTJ9XPpEmTyvwVESkkkyZNUv0lKVNPnoiIiEgRUk+eFLVRo0YBsN9+++U4ExGR5I0aNYqZM2fSpUuXXKciBUiNvCxYtmwZixYtYt26dWnZX6NGjfjss8/Ssq9cx8l0jH333TcrcYopRrrj1K5dm2bNmtGwYcO07E+kOnnmmWdYsmRJrtOQAqVGXoYtW7aMb7/9lpYtW1K3bl3MbJP3uXz5crbYYos0ZJf7OJmOUaNGGJGw7bbbFnxZshUjnXHcnVWrVjF//nwANfRERLJIY/IybNGiRbRs2ZJ69eqlpYEnUkjMjHr16tGyZUsWLVqU63RERKoVNfIybN26ddStWzfXaYjkVN26ddM2XEFERBKjRl4WqAcvd8xMr38e0Hsgkpq6deuy+eab5zoNKVAakydFrW3btkAYYyYiUmief/55zZMnKVNPnhS0sWPH0qBBgwofi4iIVFdq5EmFFixYwOmnn06rVq3YbLPNaNmyJaeddhrz5s3LdWoJW7BgAQsWLCizrE2bNpgZ48aN22j7Aw44ADMrnV+v0K1Zs4Y///nPNG3alPr163PsscdW+f6NGDGChg0blh7qNjNatGhRZht3Z8SIEWy77bbUrVuXLl26MG3atEwWRaRauuqqq/jnP/+Z6zSkQKmRJ+WaNWsWnTt3ZurUqdx///18+eWXjBs3jmnTprH//vsze/bsjMZfu3ZtWvazfPnycg/Vtm7dmjFjxpRZNnXqVKZNm0aTJk3SEjsfDB06lMcee4wJEybw5ptvsmzZMnr27Mn69esrfd4uu+zCN998U3r75JNPyqy/4YYbGD16NLfccguTJ0+mWbNmHHHEETosLpJmr7zyClOmTMl1GlKg1MiTcp111lnUqFGDiRMn0q1bN7bbbju6du3KxIkTqVGjBmeddRYAd911F82bN+fnn38u8/y+ffvy29/+tvTx008/zb777kudOnXYYYcduOSSS8o05Nq0acOIESMYMGAAjRs35sQTTwTgoosuol27dtStW5c2bdpwwQUXsHr16k0uX9++ffnvf//LV199VbpszJgx9O7de6PDvWvXruXCCy+kVatW1K9fn/33358XX3yxdP369esZOHAge+65J3Xr1mWXXXbhhhtuYMOGDaXb9O/fn549e3LzzTfTsmVLttxyS0455RRWrly5yWWpyNKlSxkzZgw33ngjRxxxBPvssw8PPPAAH3/8MRMnTqz0ubVq1aJFixalt6233rp0nbtz0003cdFFF9GrVy/22GMP7r//fpYvX86DDz6YsfKIiEhydOJFjpR3iZo+ffpw5plnsnLlSnr06LHR+v79+9O/f3++//57jjnmmI3WDx48mOOPP565c+dy0kknlVmXzMDdH374gRdeeIHLLruMevXqlVlXr149zjzzTC677DJ+/PFH+vTpw9lnn83EiRM56qijAPjpp5948sknGTt2LAAvvvgiJ554IjfffDOHHnooc+bM4YwzzmDNmjVcccUVpfv+61//yqWXXsp7772HuwNQv3597r33Xlq2bMmnn37KGWecweabb85VV12VcHnK07RpU4455hjuu+8+rrrqKtauXcu4ceN47LHHeP3118tse8oppzBz5kwefPBBWrVqxXPPPccxxxzD5MmT6dChAxs2bKBly5aMHTuWNm3a8O6773L66afTpEkTBg4cWLqfN998k2222YaJEycyd+5c+vTpQ9u2bbn44osrzLOq8YWHHHIIzz//fLnr3n//fdatW8dvfvOb0mWtW7dmt9124+233+bII4+scL+zZ8+mZcuWbLbZZhx44IFcc8017LjjjkDo5V24cGGZ/datW5dDDz2Ut99+m0GDBlWas4iIZIcaebKRL774AnenXbt25a5v37497s4XX3zBAQccQI8ePRg/fnxpI++JJ56gVq1apQ3Rq6++mvPPP59TTjkFgJ122onrr7+efv36cfnll5fut3PnzlxwwQVlYl122WWl99u0acPw4cMZNWrUJjfyAAYMGMCgQYP4y1/+wlNPPUXjxo059NBDy2wzc+ZMJkyYwOzZs9luu+0AGDJkCBMnTuSuu+7i9ttvp3bt2lx55ZWlV4lo06YNU6ZMYcKECWUaeQ0bNuSOO+6gVq1a7Lbbbhx33HG88sorlTbyPvzwwzKPV6xYUabhV9kcjAsXLqRmzZo0bdq0zPLmzZuzcOHCCp934IEHcscdd9CxY0cWLVrEyJEjOeigg0oPZZc8t3nz5hvtt+TKFiIikntq5OVIZT1r9erVq3R9kyZNKl3funXrtJxyX9HcZiW9bCXr+/XrR//+/Vm5ciX16tVj/Pjx9O7dmzp16gChR+ndd9/l+uuvL93Hhg0bWLVqFd9++23ppa7222+/jWI9+uij3HTTTXz55ZesWLGC9evXVzmeLFbNmjUrXHfkkUfi7rz88suMGTOGAQMGbLTNlClTcHfat29fZvmaNWs47LDDSh/feeed3H333cydO5dVq1axbt06tt9++zLPad++PbVq/fKV23bbbXnnnXcqzX/nnXcu8zgdlxtz90rnrevevXuZOL/61a/Ycccduf/++zn33HNLt4vfR1X7FZHkNWnSpMzQD5FkZLWRZ2bjgG5AfWAhcIO73xOt6wbcBmwHvAP0d/evo3XnAxdGzznB3adGy38NnO/uv8tmOYrdLrvsgplVeIH6zz77DDNjp512AqBnz57UqlWLJ598km7dujFx4kReeuml0u03bNjAFVdcwXHHHbfRvmJPcqhfv36Zdf/73/844YQTuOKKK/jb3/5G48aNeeqppxg2bFjCZSlpJJV3QkCNGjU4+eSTueaaa/jf//630YkYJbmbGZMnT6Z27dpl1pX0oj300EMMHTqUkSNHcthhh9GwYUNuu+02nnjiiTLbxz/fzKqsvDflcG2LFi1Yv349ixcvLjOmbtGiRRv1WFaVw+67784XX3xRul8IPYWtW7cus9/43j0R2TSPPfaY5smTlGW7J+9aYKC7rzGzXYFJZvYB8DXwOHAq8DRwFfAQ8Csz2wYYCOwI/Am4DuhpZrWA0cAJWS5D0dtqq6048sgjueeee7jooovKjMtbuXIlt912G927d2errbYCYPPNN6d3796MHz+exYsX06JFCzp37lz6nH322Yfp06dv1CsFlU9S/NZbb9GyZcsyh2y//vrrdBSx1IABA7jmmmvo0aMH22677UbrO3bsiLuzcOFCunbtWu4+/vOf/3DggQcyaNCg0t6vmTNnpiW/TTlcu++++1K7dm1efvll+vbtC8C8efP47LPPOOiggxLOYfXq1UyfPr20/DvssAMtWrTg5ZdfZv/99y/d5s033+TGG29MeL8iIpJZWW3kuXvsRFoe3XYC9gWmufsjAGY2AlgcNQQbAR+4+zIzmwicGT1/KPCUu8/OUvrVyq233kqnTp04/PDDGTlyJLvssgszZ87kkksuwd259dZby2zfr18/Dj/8cGbNmkXfvn2pUeOXE7cvv/xyevbsyfbbb0+fPn2oVasWU6dO5d133y3TgIvXtm1b5s+fz/jx4+nUqRMvvvgiEyZMSKocJXPCNWrUqNz1O+64I4sXL66wsdS2bVtOPPFE+vfvz+jRo9lnn3344YcfmDRpEjvuuCN/+MMfaNu2LWPHjuWll15ir7324l//+hevv/46W265ZVK5lmdTDtc2atSIgQMHcv7559OsWTOaNGnCueeey1577cXhhx9eut2uu+7KkCFDGDJkCADDhg2jW7du7LrrrixatIirrrqKn376iZNPPhkIPZBDhw7l6quvZtddd6Vt27aMHDmSBg0alDYmRSQ9Lr74YubMmVPuyXoiVcn6mDwzux3oD9QFPgCeA64GPirZxt1/MrOZwO7AJGBPM2sMHA5MM7PWhB68KrsjzOx04HSArbfeOuPd3itWrCgTo1GjRmmfO2z9+vUZn4+sWbNmvPrqq4waNYp+/frx3Xff0bRpU37zm98wZswYmjZtWiaHjh07su222/Lpp58yZsyYMusOOuggHnnkEW644QZGjRpFrVq12Hnnnenbt29pWdydNWvWlHlely5dOOecczjnnHNYvXo1hx12GMOHD+fcc88t3a5kOpWK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\n",
      "text/plain": [
       "<Figure size 720x216 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_activations_histogram(simple_encoder, height=0.35)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's add $\\ell_1$ regularization to the coding layer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 5s 98us/sample - loss: 0.4306 - accuracy: 0.4947 - val_loss: 0.3819 - val_accuracy: 0.4897\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 4s 75us/sample - loss: 0.3689 - accuracy: 0.4971 - val_loss: 0.3639 - val_accuracy: 0.4940\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 5s 86us/sample - loss: 0.3553 - accuracy: 0.4987 - val_loss: 0.3513 - val_accuracy: 0.4970\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 4s 78us/sample - loss: 0.3443 - accuracy: 0.5003 - val_loss: 0.3428 - val_accuracy: 0.4964\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 4s 76us/sample - loss: 0.3379 - accuracy: 0.5009 - val_loss: 0.3372 - val_accuracy: 0.4979\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 4s 76us/sample - loss: 0.3332 - accuracy: 0.5015 - val_loss: 0.3329 - val_accuracy: 0.4980\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 4s 78us/sample - loss: 0.3286 - accuracy: 0.5025 - val_loss: 0.3306 - val_accuracy: 0.4981\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 4s 76us/sample - loss: 0.3249 - accuracy: 0.5032 - val_loss: 0.3254 - val_accuracy: 0.5000\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 4s 80us/sample - loss: 0.3223 - accuracy: 0.5036 - val_loss: 0.3244 - val_accuracy: 0.4995\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 4s 75us/sample - loss: 0.3205 - accuracy: 0.5039 - val_loss: 0.3212 - val_accuracy: 0.5014\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "sparse_l1_encoder = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(100, activation=\"selu\"),\n",
    "    keras.layers.Dense(300, activation=\"sigmoid\"),\n",
    "    keras.layers.ActivityRegularization(l1=1e-3)  # Alternatively, you could add\n",
    "                                                  # activity_regularizer=keras.regularizers.l1(1e-3)\n",
    "                                                  # to the previous layer.\n",
    "])\n",
    "sparse_l1_decoder = keras.models.Sequential([\n",
    "    keras.layers.Dense(100, activation=\"selu\", input_shape=[300]),\n",
    "    keras.layers.Dense(28 * 28, activation=\"sigmoid\"),\n",
    "    keras.layers.Reshape([28, 28])\n",
    "])\n",
    "sparse_l1_ae = keras.models.Sequential([sparse_l1_encoder, sparse_l1_decoder])\n",
    "sparse_l1_ae.compile(loss=\"binary_crossentropy\", optimizer=keras.optimizers.SGD(lr=1.0),\n",
    "                     metrics=[\"accuracy\"])\n",
    "history = sparse_l1_ae.fit(X_train, X_train, epochs=10,\n",
    "                           validation_data=[X_valid, X_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(sparse_l1_ae)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAADcCAYAAADgHhCGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xe4U1XWx/HvojcBpamAoiiIDQXLawXEERuOiqKCjgiCvYwVO9ZRbGMb26A4gij2OjriiHUEu4CIiqCAAiLSERDW+8c+9xrCvblJbsol+X2eJw/JaWud5Gaxs885+5i7IyIiIiLFo1q+ExARERGR3FIDUERERKTIqAEoIiIiUmTUABQREREpMmoAioiIiBQZNQBFREREiowagCIiIiJFJqcNQDM708w+MrMVZjY8bl53M/vKzJaZ2ZtmtnnMvNpm9pCZLTKz2WZ2Xsy81mb2gZnNN7Nb47b5qpntkvUdExEREVmP5LoH8EfgOuCh2Ilm1hR4BrgC2Aj4CHgiZpEhwNbA5kA34CIzOzCadwnwCLAFcHhJg8/MjgG+c/ePsrUzIiIiIuujnDYA3f0Zd38O+CVu1pHAJHd/0t1/IzT4OprZNtH8vwDXuvuv7j4ZeBDoF83bAvivuy8EPgS2NLOGwGDg0qzukIiIiMh6qKqcA7gd8HnJC3dfCkwFtjOzDYFNY+dHz7eLnk8E/mRmjYFdgC+Ba4G/u/uCHOQuIiIisl6pke8EIg2An+OmLQQ2iOaVvI6fB/A34F5gIHAPUBPYEbjazB4DWgGj3f3u+KBmNggYBFCnTp3Om222Wem8GTNmANC6detK7Na61qxZQ7Vq2W13F0qMXMUplBi5ilMoMQC+/vrree7eLOuBsiTXNayQPvtC2Re9X1UvRq7iVLp+uXvOH4TzAIfHvL4D+EfcMhOAXsCGgAPNY+b1AiaUsd1qwLvA9sBQwiHgWoRewm0T5dSuXTuP1aVLF+/SpYtn2ptvvpnxbRZqjFzFKZQYuYpTKDHc3YGPPA81MBuPXNSwQvrsC2Vf9H5VvRi5ilPZ+lVVDgFPAjqWvDCz+kBbwnmBvwI/xc6Pnk8qYzuDgA/cfSKwA+HNWUloTG6fpdxFRERE1iu5HgamhpnVAaoD1c2sjpnVAJ4FtjezXtH8K4Ev3P2raNV/AZeb2YbRhSEDgeFx224OnEG4gARgGtDNzBoQzg38Lrt7JyIiIrJ+yPU5gJcDV8W8Ph642t2HmFkv4G5gBDAOODZmuasI5/l9DywHbnL3V+O2fQtwjbsviV7/DXgKOBV4yFMcDmbs2LGpLC4iUqWoholIIjltALr7EP7ooYufNwbYppx5K4D+0aO8bf8l7vUMYPc0UxUREREpWFXlKuAqpc3gl1k47hkAGu1+ZKW3N/3GQyq9DRGRVNxyyy0AXHDBBXnORESqIjUAy7F86nggMw3ARNasWcPMmTNZunRpxrbZqFEjJk+enLHt5StGruIUSoxcxcl0jJo1a9K8eXMaNmyYsW0KvPTSS4AagCJSNjUA82zevHmYGe3bt8/YmEGLFy9mgw02qHjBKh4jV3EKJUau4mQyhruzfPlyZs2aBaBGoIhIjlSVYWCK1oIFC2jRokVOBqYUqWrMjHr16tGyZUvmzp2b73RERIqGWh15tnr1amrWrJnvNETyqm7duqxatSrfaYiIFA0dAi6H1aidu1hmOYslUhXpO5B5devWzXcKIlKFqQFYjha9r853CiIiKWsz+OXwpOOZa79Ok0YxEClMOgQsBWv48OE0aNCg3NciIiLFSg3Acix4bxQL3huV7zSqrB9//JFBgwbRqlUratWqRcuWLRk4cCAzZ87Md2qV0qZNG8yMESNGrDNvt912w8xKx1db361YsYKzzjqLpk2bUr9+fQ477LCkPr8HH3yQLbbYgjp16tC5c2feeeed0nnz58/nrLPOYptttqFu3bq0bt2a0047jV9++SWbuyJlUA0TkUTUACzHb99/zm/ff57vNKqkadOm0aVLFyZOnMgjjzzCt99+y4gRI5g0aRK77ror06dPz2r8lStXZnX7rVu3ZtiwYWtNmzhxIpMmTaJJkyZZjZ1L5557Lk8//TSjRo3inXfeYdGiRRx66KGsXr263HWeeOIJLr74Yi699FI+/fRT9txzTw466CB++OEHIPwwmDVrFkOHDmXChAmMGDGCt99+m+OOOy5XuyUR1TARSUQNQEnZGWecQbVq1RgzZgzdu3dns802o1u3bowZM4Zq1apxxhlnAHD//ffTokULfv/997XW79OnD3/+859LX7/44ot07tyZOnXqsMUWW3DZZZet1chr06YNQ4YMoX///jRu3Ji+ffsCMHjwYNq3b0/dunVp06YNF110Eb/99lul969Pnz7873//47vvviudNmzYMI466qh1DiGvXLmSiy++mFatWlG/fn123XVXXnvttdL5q1evZsCAAeywww7UrVuXrbfemqFDh7JmzZrSZfr168ehhx7KHXfcQcuWLdlwww056aSTWLZsWaX3pTwLFy5k2LBh3HzzzfzpT3+iU6dOPProo3zxxReMGTOm3PVuu+02+vbty8CBA+nQoQN33XUXm2yyCffeey8A22+/Pc888wyHHXYYW221FV26dOHmm29mzJgxLFq0KGv7IyIiqdFFIFVQ165d15nWu3dvTj/9dJYtW8bBBx+8zvx+/frRr18/5s2bxxFHHEH16tXXmn/aaadxzDHHMGPGDE444YS15qVy0/j58+fz6quvcsUVV1CvXr215tWrV4/TTz+dK664gl9//ZXevXtz9tlnM2bMGA488EAAli5dyvPPP8/w4cMBeO211+jbty933HEH++67Lz/88AOnnnoqK1asWOtQ62233cbll1/ORx99hLsDUL9+fR566CFatmzJl19+yamnnkrt2rW59tprk96fsjRt2pSePXvy8MMPc+2117Jy5UpGjBjB008/zVtvvbXWsieddBJTp07lscceo1WrVrzyyiv07NmTDz/8kI4dO7JmzRpatmzJ8OHDadOmDePHj2fQoEE0adKEAQMGlG7nnXfeYZNNNmHMmDHMmDGD3r17065dOy655JJy86zofMZ99tmHf//732XO+/jjj1m1ahUHHHBA6bTWrVvToUMH3n//fXr06LHOOitXruTjjz8ubeCXOOCAA3j//ffLzWPRokXUrl17nb8XERHJHzUAJSXffPMN7k779u3LnL/tttvi7nzzzTfstttuHHzwwYwcObK0Afjss89So0YNevbsCcD111/PhRdeyEknnQRA27Ztuemmmzj++OO5+eabS7fbpUsXLrroorViXXHFFaXP27Rpw6WXXsott9xS6QYgQP/+/TnllFO4+uqreeGFF2jcuDH77rvvWstMnTqVUaNGMX36dDbbbDMAzjzzTMaMGcP999/PP/7xD2rWrMk111xTeveMNm3a8MknnzBq1Ki1GoANGzbk3nvvpUaNGnTo0IGjjz6aN954I2ED8LPPPltn2pIlS0obhomGAZk9ezbVq1enadOma01v0aIFs2fPLnOdefPmsXr1apo3b77OOuX1Gi5YsIArrriCgQMHUqOGyo2ISFWhilyO6nXzd0uqRD1y9erVSzi/adOmvPLKK+Xeqqt169Yp9fiVp7xx20p650rmH3/88fTr149ly5ZRr149Ro4cyVFHHUWdOnWA0BM1fvx4brrpptJtrFmzhuXLlzN79uzSxswuu+yyTqynnnqKv//973z77bcsWbKE1atXJzx/LRU9evTA3Xn99dcZNmwY/fv3X2eZTz75BHdn2223XWv6ihUr2G+//Upf33fffTzwwAPMmDGD5cuXs2rVKjbffPO11tl2223XaiBtuummjBs3LmGOW2211TrTKnubNnevcEy++PnlrbN06VJ69uxJy5YtGTp0aNo5SXryWcNEpOpTA7AczY64NN8pVElbb701ZsbkyZPLnD958mTMjLZt2wJw6KGHUqNGDZ5//nm6d+/OmDFj+M9//lO6/Jo1a7jqqqs4+uij19lWs2bNWL58ORAO98b64IMPOPbYY7nqqqu4/fbbady4MS+88ELGbnxfrVo1TjzxRG644QY++OCDdS4KKcndzPjwww/XuZtLSe/bE088wbnnnst1113HfvvtR8OGDbnnnnt49tln11o+fn0zW+s8wbJU5hDwxhtvzOrVq5k3bx7NmjUrnT537tx1ejpLNG3alOrVqzNnzpy1ps+dO5cWLVqsNW3JkiWlpyq89NJLpQ1+yR3VMBFJRA1ASclGG21Ejx49+Oc//8ngwYPXOq9r2bJl3HPPPRx00EFstNFGANSuXZujjjqKkSNHMm/ePDbeeGO6dOlSuk6nTp346quvyuzNSuS9996jZcuWax0G/v777yu5d2vr378/N9xwAwcffDCbbrrpOvN33nln3J3Zs2fTrVu3Mrfx7rvvsvvuu3PKKaeU9sxNnTo1I/lV5hBw586dqVmzJq+//jp9+vQBYObMmUyePJk999yzzHVq1apF586defPNN/nLX/5SOv3111+nV69epa8XL17MQQcdhLvz6quvauxFEZEqSA3Acvz61nAANuzSL695VEV33303e+yxB/vvvz/XXXcdW2+9NVOnTuWyyy7D3bn77rvXWv74449n//33Z9q0afTp04dq1f64+PzKK6/k0EMPZfPNN6d3797UqFGDiRMnMn78+ISHDdu1a8esWbMYOXIke+yxB6+99hqjRmV2zLMtt9ySefPmlduQateuHX37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\n",
      "text/plain": [
       "<Figure size 720x216 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_activations_histogram(sparse_l1_encoder, height=1.)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's use the KL Divergence loss instead to ensure sparsity, and target 10% sparsity rather than 0%:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure sparsity_loss_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "p = 0.1\n",
    "q = np.linspace(0.001, 0.999, 500)\n",
    "kl_div = p * np.log(p / q) + (1 - p) * np.log((1 - p) / (1 - q))\n",
    "mse = (p - q)**2\n",
    "mae = np.abs(p - q)\n",
    "plt.plot([p, p], [0, 0.3], \"k:\")\n",
    "plt.text(0.05, 0.32, \"Target\\nsparsity\", fontsize=14)\n",
    "plt.plot(q, kl_div, \"b-\", label=\"KL divergence\")\n",
    "plt.plot(q, mae, \"g--\", label=r\"MAE ($\\ell_1$)\")\n",
    "plt.plot(q, mse, \"r--\", linewidth=1, label=r\"MSE ($\\ell_2$)\")\n",
    "plt.legend(loc=\"upper left\", fontsize=14)\n",
    "plt.xlabel(\"Actual sparsity\")\n",
    "plt.ylabel(\"Cost\", rotation=0)\n",
    "plt.axis([0, 1, 0, 0.95])\n",
    "save_fig(\"sparsity_loss_plot\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "K = keras.backend\n",
    "\n",
    "class KLDivergenceRegularizer(keras.regularizers.Regularizer):\n",
    "    def __init__(self, weight, target=0.1):\n",
    "        self.weight = weight\n",
    "        self.target = target\n",
    "    def __call__(self, inputs):\n",
    "        mean_activities = K.mean(inputs, axis=0)\n",
    "        return self.weight * (\n",
    "            keras.losses.kullback_leibler_divergence(self.target, mean_activities) +\n",
    "            keras.losses.kullback_leibler_divergence(1. - self.target, 1. - mean_activities))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 5s 85us/sample - loss: 0.4151 - accuracy: 0.4948 - val_loss: 0.3714 - val_accuracy: 0.4929\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 4s 74us/sample - loss: 0.3532 - accuracy: 0.4987 - val_loss: 0.3442 - val_accuracy: 0.4968\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 4s 75us/sample - loss: 0.3340 - accuracy: 0.5013 - val_loss: 0.3292 - val_accuracy: 0.4994\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 4s 75us/sample - loss: 0.3224 - accuracy: 0.5035 - val_loss: 0.3213 - val_accuracy: 0.5009\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 4s 77us/sample - loss: 0.3170 - accuracy: 0.5043 - val_loss: 0.3170 - val_accuracy: 0.5015\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 4s 77us/sample - loss: 0.3134 - accuracy: 0.5048 - val_loss: 0.3140 - val_accuracy: 0.5018\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 4s 79us/sample - loss: 0.3107 - accuracy: 0.5052 - val_loss: 0.3114 - val_accuracy: 0.5024\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 5s 86us/sample - loss: 0.3084 - accuracy: 0.5056 - val_loss: 0.3094 - val_accuracy: 0.5025\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 4s 81us/sample - loss: 0.3064 - accuracy: 0.5059 - val_loss: 0.3074 - val_accuracy: 0.5027\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 5s 83us/sample - loss: 0.3044 - accuracy: 0.5062 - val_loss: 0.3053 - val_accuracy: 0.5032\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "kld_reg = KLDivergenceRegularizer(weight=0.05, target=0.1)\n",
    "sparse_kl_encoder = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(100, activation=\"selu\"),\n",
    "    keras.layers.Dense(300, activation=\"sigmoid\", activity_regularizer=kld_reg)\n",
    "])\n",
    "sparse_kl_decoder = keras.models.Sequential([\n",
    "    keras.layers.Dense(100, activation=\"selu\", input_shape=[300]),\n",
    "    keras.layers.Dense(28 * 28, activation=\"sigmoid\"),\n",
    "    keras.layers.Reshape([28, 28])\n",
    "])\n",
    "sparse_kl_ae = keras.models.Sequential([sparse_kl_encoder, sparse_kl_decoder])\n",
    "sparse_kl_ae.compile(loss=\"binary_crossentropy\", optimizer=keras.optimizers.SGD(lr=1.0),\n",
    "              metrics=[\"accuracy\"])\n",
    "history = sparse_kl_ae.fit(X_train, X_train, epochs=10,\n",
    "                           validation_data=[X_valid, X_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(sparse_kl_ae)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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164d559/Pr/++mvS+zdgwADeeustvvnmm5KycePG0a9fvw1OIa9evZoLLriA1q1b07BhQ3bffXdeeOGFkuVr167lxBNPpHPnztSvX5/tt9+e66+/nnXr1pWsM3jwYA499FBuvfVWWrVqxWabbcYJJ5zAihUrkt6XsixZsoRx48Zxww038Ic//IFu3brxwAMP8OmnnzJlypQy39enTx9GjhxJv379qFWr9OrjuOOOY+TIkRx88MHpSl9ERJKki0ByUGkXifTv35/TTz+dFStW0KdPnw2WDx48mMGDB7N48WKOOOIIateuvd7y0047jWOOOYZ58+Zx3HHHrbesMqfofvrpJ55//nkuvfRSGjRosN6yBg0acPrpp3PppZfy888/079/f8466yymTJnCQQcdBITeoSeffLLk1OELL7zAwIEDufXWW9lvv/2YO3cup556KqtWrVrvVOvNN9/MiBEjeP/993F3ABo2bMg///lPWrVqxeeff86pp57KxhtvnPQp9mbNmtG3b1/uu+8+rrzySlavXs2ECRN49NFHefXVV9db94QTTuDrr7/mwQcfpHXr1jz77LP07duX9957jy5durBu3TpatWrF+PHjadeuHe+++y5Dhw6ladOmnHjiiSXbef3119liiy2YMmUK8+bNo3///rRv356LLrqozDwrGs+477778txzz5W67IMPPmDNmjX88Y9/LClr06YNHTt2ZOrUqfTu3TuRj0pERKopNQClUr766ivcnQ4dOpS6fMcdd8Td+eqrr9hjjz3o06cPEydOLGkAPv7449SpU4e+ffsCcPXVV3PeeedxwgknALDtttty3XXXMWjQIG644YaS7fbo0YPzzz9/vViXXnppyfN27dpx8cUXc+ONN6ZkjOWQIUM45ZRTuPzyy3nqqacoKChgv/32W2+dr7/+mkmTJjFnzhzatm0LwLBhw5gyZQp33XUXt99+O3Xr1uWKK64ouXtGu3bt+PDDD5k0adJ6DcDGjRtzxx13UKdOHTp27MjRRx/NSy+9VG4D8OOPP96grKioqKRhWN50HQsXLqR27do0a9ZsvfLNN9+chQsXVvwBiYhItaYGYIY1bty4wnFk5fXINWjQoNzlzZo149lnny3zVl1t2rRJyaD8suZtK+6dK14+aNAgBg8ezIoVK2jQoAETJ06kX79+1KtXDwg9Ue+++y7XXXddyTbWrVvHypUrWbhwYUljZrfddtsg1iOPPMKYMWOYNWsWRUVFrF27ttzxa5XRu3dv3J0XX3yRcePGMWTIkA3W+fDDD3F3dtxxx/XKV61axf7771/y+s477+Tuu+9m3rx5rFy5kjVr1rDVVlut954dd9yROnV+Pxy33HJL3nnnnXJz3G677TYoS/Y2be6uOfmkXE2bNqX2/zRpt0h1pwZghl1xxRXVeh7A7bffHjNjxowZpS6fMWMGZsa2224LwKGHHkqdOnV48sknOeCAA5gyZQr//e9/S9Zft24dI0eO5Oijj95gW82bN2flypVAON0b6+233+bYY49l5MiR3HLLLRQUFPDUU0+l7Ab1tWrV4vjjj+eaa67h7bff3uCikOLczYz33nuPunXrrresuPftoYceYvjw4Vx11VXsv//+NG7cmNtuu43HH398vfXj329m640TLE0yp4BbtmzJ2rVrWbx4Mc2bNy8pX7Ro0QY9nSKxHn300ZTPASgimacGoFRKkyZN6N27N/feey8XXnjheuMAV6xYwW233cbBBx9MkyZNgHDnk379+jFx4kQWL15My5Yt6dGjR8l7unXrxhdffFFqb1Z53nzzTVq1arXeaeBvv/02yb1b35AhQ7jmmmvo06cPW2655QbLu3btiruzcOFCevXqVeo23njjDfbcc09OOeWUkp65r7/+OiX5JXMKeNddd6Vu3bq8+OKLDBgwAID58+czY8YM9tprr5TkJyIiuUsNwAy75557eOGFF7j22muznUqVjR07lu7du3PggQdy1VVXsf322/P1119zySWX4O6MHTt2vfUHDRrEgQceyOzZsxkwYMB6V49edtllHHrooWy11Vb079+fOnXqMG3aNN59912uv/76MnNo3749CxYsYOLEiXTv3p0XXniBSZNSOzfZNttsw+LFi8tsSLVv356BAwcyePBgbrrpJrp168ZPP/1EYWEh22yzDUceeSTt27dn/Pjx/Pe//2XnnXfm3//+N6+++iqbbbZZ0vklcwp400035cQTT+S8886jRYsWNG3alHPOOYedd96ZAw88sGS9HXbYgWHDhjFs2DAgNDA//fRTGjZsyLp165g7dy4ff/wxTZo0KRkH+dNPPzF37lx++eUXAGbNmkVBQQEtW7akZcuWSe+3ZNdFF13Ez6/OYrMeg7OdiogkQdPAZNj0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\n",
      "text/plain": [
       "<Figure size 720x216 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_activations_histogram(sparse_kl_encoder)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hashing Autoencoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 4s 77us/sample - loss: 0.4999 - accuracy: 0.4830 - val_loss: 0.4866 - val_accuracy: 0.4815\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.4780 - accuracy: 0.4892 - val_loss: 0.4768 - val_accuracy: 0.4540\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.4284 - accuracy: 0.4889 - val_loss: 0.4229 - val_accuracy: 0.4757\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 4s 70us/sample - loss: 0.4088 - accuracy: 0.4895 - val_loss: 0.4195 - val_accuracy: 0.4752\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 4s 70us/sample - loss: 0.4018 - accuracy: 0.4900 - val_loss: 0.4166 - val_accuracy: 0.4751\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.3971 - accuracy: 0.4905 - val_loss: 0.4170 - val_accuracy: 0.4746\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 4s 69us/sample - loss: 0.3933 - accuracy: 0.4909 - val_loss: 0.4106 - val_accuracy: 0.4763\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 4s 71us/sample - loss: 0.3902 - accuracy: 0.4912 - val_loss: 0.4038 - val_accuracy: 0.4794\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 4s 65us/sample - loss: 0.3877 - accuracy: 0.4917 - val_loss: 0.4049 - val_accuracy: 0.4782\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 4s 66us/sample - loss: 0.3858 - accuracy: 0.4917 - val_loss: 0.4002 - val_accuracy: 0.4793\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "hashing_encoder = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),\n",
    "    keras.layers.Dense(100, activation=\"selu\"),\n",
    "    keras.layers.GaussianNoise(15.),\n",
    "    keras.layers.Dense(16, activation=\"sigmoid\"),\n",
    "])\n",
    "hashing_decoder = keras.models.Sequential([\n",
    "    keras.layers.Dense(100, activation=\"selu\", input_shape=[16]),\n",
    "    keras.layers.Dense(28 * 28, activation=\"sigmoid\"),\n",
    "    keras.layers.Reshape([28, 28])\n",
    "])\n",
    "hashing_ae = keras.models.Sequential([hashing_encoder, hashing_decoder])\n",
    "hashing_ae.compile(loss=\"binary_crossentropy\", optimizer=keras.optimizers.SGD(lr=1.0),\n",
    "                   metrics=[\"accuracy\"])\n",
    "history = hashing_ae.fit(X_train, X_train, epochs=10,\n",
    "                         validation_data=[X_valid, X_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(hashing_ae)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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5ptv8tVXX5VOGzlyJH369FnnEPKqVav4+9//TuvWrWnYsCF77LEHL774Yun8NWvWMHjwYDp27Ej9+vXZZpttuP7661m7dm3pMgMHDuTQQw/l1ltvpVWrVmy00UYcf/zxLF++vNr7UpFff/2VkSNHcsMNN/DHP/6R3XbbjQcffJCPP/6YCRMmVLjeiy++yIABA9hxxx3p2LEjDz74ID/88ANvvPFGmeXq1avHpptuWvrYeOONM7YvIiKSPF0Ekoe6du26zrS+fftyyimnsHz5cg4++OB15g8cOJCBAweyaNEijjjiCGrXrl1m/sknn8zRRx/N3LlzOfbYY8vMS+ZG6j/99BMvvPACF198MQ0aNCgzr0GDBpxyyilcfPHF/Pzzz/Tt25fTTz+dCRMmcOCBBwKwbNkynn76aUaNGgWEBkX//v259dZb2X///fnmm2846aSTWLlyZZlDrf/4xz+46KKLePfdd3F3ABo2bMh9991Hq1at+PTTTznppJOoV69etQ8FNWvWjF69enH//fdzxRVXsGrVKkaPHs3jjz/Oq6++WmbZ448/ni+//JKHHnqI1q1b8/zzz9OrVy+mTp3KzjvvzNq1a2nVqhWjRo2ibdu2vPPOOwwZMoSmTZsyePDg0u28/vrrtGzZkgkTJjB37lz69u1L+/btOf/88yvMs6rzGffbb78KT45/7733WL16NX/6059Kp7Vp04btttuOKVOm0LNnz0TeKpYsWcLatWvZaKONykyfPHkyLVq0oEmTJnTp0oWrrrqKFi1aJLRNERHJPDUAJSmff/457l7hHUO233573J3PP/+czp07c/DBBzNmzJjSBuCTTz5JnTp16NWrFwBXXXUV5557LscffzwAW221Fddddx0DBgzghhtuKN1uly5dGD58eJlYF198cenztm3bcsEFF3DjjTem5VygQYMGMXToUC677DKeeeYZmjRpwv77719mmS+//JKxY8cyZ84cNt98cwBOO+00JkyYwD333MOdd95J3bp1ufzyy0vvntG2bVvef/99xo4dW6YB2LhxY+666y7q1KnDdtttx1FHHcXLL79caQPwww8/XGfa0qVLSxuGlQ2NsWDBAmrXrk2zZs3KTN9kk01YsGBB1W9Q5IwzzmCXXXZhr732Kp124IEHcuSRR7LlllsyZ84cLrroIg444ADee+896tWrl/C2RUQkc9QAzEOV9cg1aNCg0vnNmjXj+eefr/BWXW3atCl3/fgew6pUNG5bSe9cyfwBAwYwcOBAli9fToMGDRgzZgx9+vRh/fXXB0JP1DvvvMN1111Xuo21a9eyYsUKFixYUNqY2X333deJ9dhjj3HLLbfwxRdfsHTpUtasWVPp+WvJ6NmzJ+7OSy+9xMiRIxk0aNA6y7z//vu4O9tvv32Z6StXruSAAw4ofX333Xdz7733MnfuXFasWMHq1avZYostyqyz/fbbU6fO71/HzTbbjLfffrvSHLfeeut1plX3Nm3unvCYfGeddRaTJ09m8uTJZf5+jjnmmNLnHTt2pFOnTmyxxRY899xzHHnkkSnnJlKRQjo3VyRb1AAUoPzGRHm22WYbzIwZM2aUO3/GjBmYGVtttRUAhx56KHXq1OHpp5+me/fuTJgwgf/+97+ly69du5ZLL72Uo446ap1tNW/enBUrVgDhcG+st956i2OOOYZLL72Um2++mSZNmvDMM8+k7WbwtWrV4rjjjuPqq6/mrbfeWueikJLczYypU6dSt27dMvNKet8eeeQRhg0bxpVXXskBBxxA48aNueOOO3jyySfLLB+/vpmVOU+wPNU5BLzpppuyZs0aFi1aRPPmzUunL1y4cJ2ezvKceeaZPPzww0ycOJF27dpVuuxmm21G69at+fzzz6vcrkgqHn/88VynIFLjqAEoSdl4443p2bMn//73vznvvPPKnAe4fPly7rjjDg466KDSk/7r1atHnz59GDNmDIsWLWLTTTelS5cupevstttuzJw5M+EGaIk33niDVq1alTkM/PXXX1dz78oaNGgQV199NQcffDCbbbbZOvN33XVX3J0FCxbQrVu3crcxefJk9txzT4YOHVraM/fll1+mJb/qHALu1KkTdevW5aWXXqJfv34AzJs3jxkzZrD33ntXGnf48OE88cQTTJo0iW233bbKPBctWsT8+fNp2bJllcuKiEh2qAEoAKXjv7Vu3brKZW+//Xb22msvevTowZVXXsk222zDl19+yYUXXoi7c/vtt5dZfsCAAfTo0YPZs2fTr18/atX6/eLzSy65hEMPPZQtttiCvn37UqdOHaZNm8Y777zD9ddfX2EO7du3Z/78+YwZM4a99tqLF198kbFjx6a49+Vr164dixYtqrAh1b59e/r378/AgQO56aab2G233fjpp5+YNGkS7dq148gjj6R9+/aMGjWK//73v+y00048/PDDvPrqq+tcNJGK6hwC3nDDDRk8eDDnnnsuLVq0oGnTppx11lnstNNO9OjRo3S5bbfdltNOO43TTjsNCFeAjxkzhqeeeoqNNtqo9HzBRo0a0ahRI5YuXcqIESPo3bs3LVu2ZM6cOZx//vm0aNGCI444otr7LFKeknNlr7nmmhxnIlJzaBgYAcLVucuWLUto2a222opXX32VHXbYgWOPPZZ27drRr18/tttuO6ZOncqWW25ZZvn999+/9ErdAQMGlJnXs2dPnnvuOSZOnEjnzp3p3Lkz1157belFFRXp1asX5557LsOGDWOnnXbipZde4vLLL09upxOw8cYbV9qTdv/993P88cczfPhwtt12Ww499FBee+210nP8hg4dSt++fTnhhBNKx0g8++yz055nKm6++WaOPPJIjj76aPbZZx8aNWrE+PHjy5zPN2vWLBYtWlT6+s4772TJkiV0796dli1blj5KrtiuXbs2n3zyCYcddhjt27fnuOOOo0OHDrz55pvVOjdRpDJvvvkmb775Zq7TEKlZ3F0Pd9q3b+/ZMHHixNLnn376aUZiLF68OOl1Zs6c6TNnzsxojFRkI06hxMhWnEzFiP0+xH5PMgl41/Og/qTjkY0alo3PJZUYXbp08S5dumQ8TrIKJUa24hRKjGzFqW79Ug+giIiISJFRA1BERESkyOgiEAHWHYZERKSmSOTiNREpSw1AAahyLDcRkXw1evToXKcgUuPkzSFgM2trZs+b2c9mtsDMbjezOtG8XczsPTNbHv27S8x6/czsOzObbWZdY6ZvZWZTzCy5W1xkWTiPU6S46XsgIpJdedMABO4EFgItgV2ALsApZrYe8DQwGtgIeAB42szWixqI1wK7AX8DYgeguw04y93Tc2+wDKhbt27pnS5y7ZtvvuGbb77JdRpSpFasWKHTECRlw4YNY9iwYblOQ6RGyacG4JbAOHf/zd0XAC8AOwBdCYeqb3H3le5+G2DAAUBTYL67fwdMANoBmFmfaPpb2d+NxLVo0YL58+ezfPnynPeArFixIm8ao1I83J3ly5czf/58WrRoket0pIb68MMPy70zjohUzHLd8ChhZicBewMnEXr6XgQuBtoCf3L3g2KWfRaYCNwMzCQ0BncFLgG6AZOB7u7+YxUx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\n",
      "text/plain": [
       "<Figure size 720x216 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_activations_histogram(hashing_encoder)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0000100100000001\n",
      "0000100100000000\n",
      "0000100100000001\n",
      "0000100000000000\n",
      "0000100000100000\n",
      "...\n"
     ]
    }
   ],
   "source": [
    "hashes = np.round(hashing_encoder.predict(X_valid)).astype(np.int32)\n",
    "hashes *= np.array([[2**bit for bit in range(16)]])\n",
    "hashes = hashes.sum(axis=1)\n",
    "for h in hashes[:5]:\n",
    "    print(\"{:016b}\".format(h))\n",
    "print(\"...\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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r8+EpHPdF9JS7LZt2wD43e9+B8DHP/7xfarH3hCWDTItIQD/+q//CsDjjz/O73//ewC++c1vAvDmm28CcPjhhw/od3OtLatNe3p6rP3i4/KXv/wlf/jDHwA48cQTAZg8eTIPPvggAB/96Ecz7rt69WogshisW7eO9vZ2IN03AbtneXk511577aDWa09k04A0r3z7298G0qbaadOmAVjZQ+0wfq9s2qqeaVlZ2SCVvG+y1SvbuLz++uuB9ByqOUSWyFBjztb/qqurATjmmGOAaO4pFJ588kkAbr/9diDtBtVzkStC8yz0z+3X0tICRHUfCK4xO47jOE4Bsd9pzHHpTn6chQsXMnbsWADuuOMOAK666irGjRsHRFrH888/D8A111xjAV27du0C4J577rH7615Lly7NWV12R9yXLU25o6ODb3zjGwA89thjQFqbnjx5MgCTJk3q9cTY3FoAACAASURBVP3x48eb5ijNWZIuwMUXXwzA4sWLAfjVr3416GXfnZ+lubkZiLT7W265BYDZs2ebVqX2Ofzww2lqagLg4YcfBiJf8+60Q/ndpWmrrvn0ve7ut+rq6kzT+t73vgfAsccey7x584D0MwD4/ve/D8D//b//d0C/u2XLFiZOnLhXZY4TasJxrbgv//DRRx9Na2srEPXLhx56yHyMsmSIN954w6whGquPPfYY73vf+wAYM2YMgI3n/sQaDJSenh7rv9naThYQtdldd91lmp/KN3nyZNMiy8vLgcgScOaZZ/LEE0/0umdffsi7777bLHi5JJvWLh555BErv+ra1tZm86PqfdlllwFpy5S04rVr1wLp56Q59vjjjwfgpptuAuDggw82C0m+ueGGGwB44IEHrKwHHnggkA5OU31lgZVVYMeOHWbVyobutWjRIgAuueQSxo8fP6CyucbsOI7jOAVEUTYfYB7Y7Y+qPMlkMqsdX1KMJLSnnnoKgM985jMWgi8N8s477zR/j/y0f/rTnwBobW01n4G0i4qKCiZMmGC/D1BVVQXAo48+an8D/Qm369eDlYSeTQuJc+ONN/LDH/4QgFmzZgFpbVrS2PLly4FIq9i2bZvVN/Qj//znPwfS21cg0miGDRvGf/7nfwIwZsyYftexL4kbMG33rbfeAtKakLRiaRUqQ2trqz1nRd02NTWxcuVKAPPDSqs67bTTmDJlCgBz5swB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\n",
      "text/plain": [
       "<Figure size 576x288 with 32 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_bits = 4\n",
    "n_images = 8\n",
    "plt.figure(figsize=(n_images, n_bits))\n",
    "for bit_index in range(n_bits):\n",
    "    in_bucket = (hashes & 2**bit_index != 0)\n",
    "    for index, image in zip(range(n_images), X_valid[in_bucket]):\n",
    "        plt.subplot(n_bits, n_images, bit_index * n_images + index + 1)\n",
    "        plt.imshow(image, cmap=\"binary\")\n",
    "        plt.axis(\"off\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Variational Autoencoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Sampling(keras.layers.Layer):\n",
    "    def call(self, inputs):\n",
    "        mean, log_var = inputs\n",
    "        return mean + K.exp(log_var / 2) * K.random_normal(shape=tf.shape(log_var))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/50\n",
      "55000/55000 [==============================] - 4s 78us/sample - loss: 0.3955 - accuracy: 0.4948 - val_loss: 0.3567 - val_accuracy: 0.4984\n",
      "Epoch 2/50\n",
      "55000/55000 [==============================] - 4s 64us/sample - loss: 0.3471 - accuracy: 0.5027 - val_loss: 0.3452 - val_accuracy: 0.4987\n",
      "Epoch 3/50\n",
      "55000/55000 [==============================] - 3s 63us/sample - loss: 0.3349 - accuracy: 0.5042 - val_loss: 0.3340 - val_accuracy: 0.5004\n",
      "Epoch 4/50\n",
      "55000/55000 [==============================] - 3s 61us/sample - loss: 0.3289 - accuracy: 0.5049 - val_loss: 0.3308 - val_accuracy: 0.5034\n",
      "Epoch 5/50\n",
      "55000/55000 [==============================] - 3s 57us/sample - loss: 0.3253 - accuracy: 0.5053 - val_loss: 0.3249 - val_accuracy: 0.5030\n",
      "Epoch 6/50\n",
      "55000/55000 [==============================] - 3s 58us/sample - loss: 0.3228 - accuracy: 0.5055 - val_loss: 0.3298 - val_accuracy: 0.5003\n",
      "Epoch 7/50\n",
      "55000/55000 [==============================] - 3s 60us/sample - loss: 0.3209 - accuracy: 0.5058 - val_loss: 0.3218 - val_accuracy: 0.5034\n",
      "Epoch 8/50\n",
      "55000/55000 [==============================] - 3s 55us/sample - loss: 0.3194 - accuracy: 0.5059 - val_loss: 0.3244 - val_accuracy: 0.5038\n",
      "Epoch 9/50\n",
      "55000/55000 [==============================] - 3s 61us/sample - loss: 0.3182 - accuracy: 0.5060 - val_loss: 0.3203 - val_accuracy: 0.5018\n",
      "Epoch 10/50\n",
      "55000/55000 [==============================] - 3s 56us/sample - loss: 0.3173 - accuracy: 0.5062 - val_loss: 0.3175 - val_accuracy: 0.5034\n",
      "Epoch 11/50\n",
      "55000/55000 [==============================] - 3s 58us/sample - loss: 0.3165 - accuracy: 0.5063 - val_loss: 0.3169 - val_accuracy: 0.5035\n",
      "Epoch 12/50\n",
      "55000/55000 [==============================] - 3s 56us/sample - loss: 0.3158 - accuracy: 0.5064 - val_loss: 0.3180 - val_accuracy: 0.5030\n",
      "Epoch 13/50\n",
      "55000/55000 [==============================] - 3s 62us/sample - loss: 0.3152 - accuracy: 0.5064 - val_loss: 0.3177 - val_accuracy: 0.5040\n",
      "Epoch 14/50\n",
      "55000/55000 [==============================] - 3s 59us/sample - loss: 0.3147 - accuracy: 0.5065 - val_loss: 0.3162 - val_accuracy: 0.5037\n",
      "Epoch 15/50\n",
      "55000/55000 [==============================] - 3s 59us/sample - loss: 0.3143 - accuracy: 0.5065 - val_loss: 0.3163 - val_accuracy: 0.5038\n",
      "Epoch 16/50\n",
      "55000/55000 [==============================] - 3s 61us/sample - loss: 0.3138 - accuracy: 0.5066 - val_loss: 0.3155 - val_accuracy: 0.5031\n",
      "Epoch 17/50\n",
      "55000/55000 [==============================] - 3s 61us/sample - loss: 0.3134 - accuracy: 0.5066 - val_loss: 0.3157 - val_accuracy: 0.5040\n",
      "<<31 more lines>>\n",
      "55000/55000 [==============================] - 3s 54us/sample - loss: 0.3101 - accuracy: 0.5070 - val_loss: 0.3119 - val_accuracy: 0.5044\n",
      "Epoch 34/50\n",
      "55000/55000 [==============================] - 3s 54us/sample - loss: 0.3100 - accuracy: 0.5070 - val_loss: 0.3120 - val_accuracy: 0.5038\n",
      "Epoch 35/50\n",
      "55000/55000 [==============================] - 3s 54us/sample - loss: 0.3098 - accuracy: 0.5071 - val_loss: 0.3120 - val_accuracy: 0.5036\n",
      "Epoch 36/50\n",
      "55000/55000 [==============================] - 3s 56us/sample - loss: 0.3097 - accuracy: 0.5071 - val_loss: 0.3135 - val_accuracy: 0.5032\n",
      "Epoch 37/50\n",
      "55000/55000 [==============================] - 3s 55us/sample - loss: 0.3096 - accuracy: 0.5071 - val_loss: 0.3122 - val_accuracy: 0.5044\n",
      "Epoch 38/50\n",
      "55000/55000 [==============================] - 3s 55us/sample - loss: 0.3095 - accuracy: 0.5071 - val_loss: 0.3110 - val_accuracy: 0.5038\n",
      "Epoch 39/50\n",
      "55000/55000 [==============================] - 3s 54us/sample - loss: 0.3094 - accuracy: 0.5071 - val_loss: 0.3126 - val_accuracy: 0.5044\n",
      "Epoch 40/50\n",
      "55000/55000 [==============================] - 3s 54us/sample - loss: 0.3093 - accuracy: 0.5071 - val_loss: 0.3140 - val_accuracy: 0.5033\n",
      "Epoch 41/50\n",
      "55000/55000 [==============================] - 3s 55us/sample - loss: 0.3092 - accuracy: 0.5071 - val_loss: 0.3112 - val_accuracy: 0.5044\n",
      "Epoch 42/50\n",
      "55000/55000 [==============================] - 3s 55us/sample - loss: 0.3092 - accuracy: 0.5071 - val_loss: 0.3120 - val_accuracy: 0.5038\n",
      "Epoch 43/50\n",
      "55000/55000 [==============================] - 3s 57us/sample - loss: 0.3090 - accuracy: 0.5071 - val_loss: 0.3108 - val_accuracy: 0.5035\n",
      "Epoch 44/50\n",
      "55000/55000 [==============================] - 3s 57us/sample - loss: 0.3090 - accuracy: 0.5072 - val_loss: 0.3131 - val_accuracy: 0.5045\n",
      "Epoch 45/50\n",
      "55000/55000 [==============================] - 3s 57us/sample - loss: 0.3089 - accuracy: 0.5071 - val_loss: 0.3109 - val_accuracy: 0.5036\n",
      "Epoch 46/50\n",
      "55000/55000 [==============================] - 3s 55us/sample - loss: 0.3089 - accuracy: 0.5072 - val_loss: 0.3119 - val_accuracy: 0.5037\n",
      "Epoch 47/50\n",
      "55000/55000 [==============================] - 3s 58us/sample - loss: 0.3088 - accuracy: 0.5072 - val_loss: 0.3112 - val_accuracy: 0.5035\n",
      "Epoch 48/50\n",
      "55000/55000 [==============================] - 3s 52us/sample - loss: 0.3087 - accuracy: 0.5072 - val_loss: 0.3100 - val_accuracy: 0.5042\n",
      "Epoch 49/50\n",
      "55000/55000 [==============================] - 3s 53us/sample - loss: 0.3086 - accuracy: 0.5072 - val_loss: 0.3110 - val_accuracy: 0.5044\n",
      "Epoch 50/50\n",
      "55000/55000 [==============================] - 3s 52us/sample - loss: 0.3086 - accuracy: 0.5072 - val_loss: 0.3113 - val_accuracy: 0.5036\n"
     ]
    }
   ],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "codings_size = 30\n",
    "\n",
    "inputs = keras.layers.Input(shape=[28, 28])\n",
    "z = keras.layers.Flatten()(inputs)\n",
    "z = keras.layers.Dense(150, activation=\"selu\")(z)\n",
    "z = keras.layers.Dense(100, activation=\"selu\")(z)\n",
    "codings_mean = keras.layers.Dense(codings_size)(z)\n",
    "codings_log_var = keras.layers.Dense(codings_size)(z)\n",
    "codings = Sampling()([codings_mean, codings_log_var])\n",
    "variational_encoder = keras.models.Model(inputs=[inputs], outputs=[codings_mean, codings_log_var, codings])\n",
    "\n",
    "decoder_inputs = keras.layers.Input(shape=[codings_size])\n",
    "x = keras.layers.Dense(100, activation=\"selu\")(decoder_inputs)\n",
    "x = keras.layers.Dense(150, activation=\"selu\")(x)\n",
    "x = keras.layers.Dense(28 * 28, activation=\"sigmoid\")(x)\n",
    "outputs = keras.layers.Reshape([28, 28])(x)\n",
    "variational_decoder = keras.models.Model(inputs=[decoder_inputs], outputs=[outputs])\n",
    "\n",
    "_, _, codings = variational_encoder(inputs)\n",
    "reconstructions = variational_decoder(codings)\n",
    "variational_ae = keras.models.Model(inputs=[inputs], outputs=[reconstructions])\n",
    "\n",
    "kld_loss = -0.5 * K.sum(1 + codings_log_var - K.exp(codings_log_var) - K.square(codings_mean), axis=-1)\n",
    "variational_ae.add_loss(K.mean(kld_loss) / 784.)\n",
    "variational_ae.compile(loss=\"binary_crossentropy\", optimizer=\"rmsprop\", metrics=[\"accuracy\"])\n",
    "history = variational_ae.fit(X_train, X_train, epochs=50,\n",
    "                             validation_data=[X_valid, X_valid],\n",
    "                             batch_size=128)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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wqxYsWLU7wlxqQKDBQsWyGPXr19vYmqfqNbWVjn+2WefNbF33nnHxFRxRkp63zzVrkl992tra+U51XhViFFXVyfHNzY2mlhXV5eJ3XLLLXL8zp07TUwVWHit4i666CIZHwu8YQEAQiBhAQBCIGEBAEIgYQEAQqiYoovLL79cxtW+MGpBsdRflk8kx44dMzG1J463f05upwxMDGruLVy4UB6rukqoTgteV4b29vasWKmKdKkZj88edf/evlezZs0a69v5FW9YAIAQSFgAgBBIWACAEEhYAIAQSFgAgBAqpkrQq1RRLZtUi5Qie7qovafGY6VPEaoqyGvF0tTUZGK33367ifX398vxXkUnJiY1d1atWiWPVdV/bW1tWcd51xoL4/F54FUunn322SZ23333mZi3R9kll1xS2o0VwBsWACAEEhYAIAQSFgAgBBIWACCEqiItRAAAKBfesAAAIZCwAAAhkLAAACGQsAAAIZCwAAAhkLAAACGQsAAAIZCwAAAhkLAAACGQsAAAIZCwAAAhkLAAACGQsAAAIZCwAAAhkLAAACGQsAAAIZCwAAAhkLAAACGQsAAAIZCwAAAhkLAAACGQsAAAIZCwAAAhkLAAACGQsAAAIZCwAAAh/B+6rihRN6gjVgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_reconstructions(variational_ae)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Generate Fashion Images"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's train the model and generate a few random fashion images:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "tf.random.set_seed(42)\n",
    "np.random.seed(42)\n",
    "\n",
    "n_rows = 6\n",
    "n_cols = 10\n",
    "codings_rnd = np.random.normal(size=[n_rows * n_cols, codings_size])\n",
    "images = variational_decoder.predict(codings_rnd)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_multiple_images(images, n_rows, n_cols, pad=2):\n",
    "    images = images - images.min()  # make the minimum == 0, so the padding looks white\n",
    "    w,h = images.shape[1:]\n",
    "    image = np.zeros(((w+pad)*n_rows+pad, (h+pad)*n_cols+pad))\n",
    "    for y in range(n_rows):\n",
    "        for x in range(n_cols):\n",
    "            image[(y*(h+pad)+pad):(y*(h+pad)+pad+h),(x*(w+pad)+pad):(x*(w+pad)+pad+w)] = images[y*n_cols+x]\n",
    "    plt.imshow(image, cmap=\"Greys\", interpolation=\"nearest\")\n",
    "    plt.axis(\"off\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving figure generated_fashion_images_plot\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 5))\n",
    "plot_multiple_images(images, n_rows, n_cols)\n",
    "save_fig(\"generated_fashion_images_plot\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Encode & Decode"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_iterations = 3\n",
    "n_images = 10\n",
    "source_codings = np.random.normal(size=[n_images, codings_size])\n",
    "target_codings = np.roll(source_codings, -1, axis=0)\n",
    "images = []\n",
    "for iteration in range(n_iterations):\n",
    "    codings_interpolate = source_codings + (target_codings - source_codings) * iteration / n_iterations\n",
    "    images.append(variational_decoder(codings_interpolate).numpy())\n",
    "images = np.concatenate(images)\n",
    "\n",
    "plt.figure(figsize=(8, 3))\n",
    "plot_multiple_images(images, n_iterations, n_cols)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  },
  "nav_menu": {
   "height": "381px",
   "width": "453px"
  },
  "toc": {
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 6,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
